Java:在main()方法中调用静态方法

4
我应该做以下事情:
编写一个Java应用程序(客户端)程序,它具有一个称为generateEmployees()的静态方法,该方法返回10种不同类型的Employee对象的随机列表。您可以使用数组或ArrayList存储将返回的雇员对象。使用for循环随机填充不同类型的员工对象并添加一些随机数据。您可能会考虑1-4个值范围。如果随机值是1,则创建一个带有一些随机生成数据的HourlyEmployee对象;如果是2,则创建一个带有一些随机数据的SalariedEmployee对象,依此类推。我会让你自己想出如何生成和填充这些不同的Employee对象。在生成这些对象时,将它们添加到您正在使用的数据结构(数组或ArrayList)中。最后,该方法返回此数据结构。
在同一应用程序类中,实现main()方法。调用generateEmployees()静态方法,并使用for循环在终端窗口上打印每个雇员的详细信息及其收入。
我的generateEmployees()静态方法如下所示(可能不正确...而且数据还没有被随机生成,因为我不确定如何随机生成名字和姓氏):
public static Employee[] generateEmployees()
{
    Employee[] employees = new Employee[10];
    int randomNum = 0;
    
    for (int i = 0; i < 10; i++)
    {
        Random random = new Random();
        randomNum = random.nextInt(4) + 1;
         
         switch (randomNum)
         {
            case 0:
                employees[i] = new SalariedEmployee("Bri", "Gefroh", 123, 1000);
                break;
            case 1:
                employees[i] = new HourlyEmployee("Bri", "Gefroh", 123, 12.50, 10);
                break;
            case 2:
                employees[i] = new CommissionEmployee("Bri", "Gefroh", 123, 10000, 0.05);
                break;
            case 3:
                employees[i] = new BasePlusCommissionEmployee("Bri", "Gefroh", 123, 10000, 0.05, 2500);
                break;
         }
    }
    
    return employees;
}

如何调用这个方法并在主方法中使用它?这四种类型的员工都是Employee类的子类,每个子类都有自己的toStirng()方法,我相信这就是我应该输出的。


不确定您在这里具体要求什么,但静态方法仅与类相关联,只要它们在类的命名空间中。您可以使用<Classname> .<static_method_name>从另一个类调用一个类的静态方法,因此在您的情况下,如果主方法不在Employee类中,则可以调用Employee.generateEmployees(),如果它在Employee类中,则只需调用generateEmployees()。还有第三种选择,即添加静态方法导入语句,请参见文档 - aakarsh
我想也许我的真正问题是,我在主方法中尝试实现generateEmployees()方法的方式有什么问题。 我调用generateEmployees()方法的方式基本上与这里的答案相同,但我的代码会抛出NullPointerException。 public static void main(String [] args) { Employee[] employees = new Employee[10]; employees = generateEmployees(); for (int i = 0; i < 10; i++) { System.out.println(employees[i].toString()); } } - Brittany Gefroh
问题在于你使用了random.nextInt(4),它会给你一个值[0,3) 0包含 4排除,这落在你的4个情况之内,但是你又加上了1,导致了一个未被考虑的情况case 4:。一种快速测试方法是通过抛出运行时异常或者在那里添加assert或者打印语句来处理默认情况,以确保只发生你所期望的情况。同时,在生成输出时,你也可以为employee[i]!=null添加一个测试。 - aakarsh
抱歉,看起来你的问题已经得到解答了。 - aakarsh
@BrittanyGefroh 你好,如果你认为你的问题已经得到了回答,请将答案标记为已接受并/或赞同。这样做可以提高你的采纳率,其他用户也会更愿意帮助你回答未来的问题。 - dreamcrash
4个回答

5

静态方法是类方法,而不是实例方法。它是在类上调用的,而不是类的实例上调用的。区别在于您可以在没有实例的情况下调用静态方法。

Employee.doSomething();

vs

Employee employee = new Employee();
employee.doSomethingElse();

所以,如果您的generateEmployees()方法与您的主函数在同一个类中,您只需要:
 generateEmployees();

否则您需要执行以下操作
 Employee.generateEmployees();

(如果Employee类包含generateEmployees())

就您的NPE而言,random.nextInt(4) + 1; 返回1到4之间的值。nextInt应该返回0到4之间的值,包括0但不包括4,这意味着是0-3。加一会将其变为1-4。由于您没有指定“4”的情况,因此您留下了数组中某些位置为空。 - Scott Woodward

0
如果方法在同一个类中,您应该可以像调用其他方法一样调用它:
public static void main(String[] args)
{
    Employee[] employees = generateEmployees();

    // TODO: loop through and print out...
}

由于maingenerateEmployees都是静态的,所以它应该可以工作。(如果generateEmployees是非静态的,则需要先创建类的实例)。

我建议使用一个包含“名称”的常量字符串数组,并使用随机数生成索引。这应该有助于稍微随机化名称。


好的,这正是我所想的,但我一定是做错了其他事情。那个带有System.out.println()的行抛出了NullPointerException。public static void main(String [] args) { Employee[] employees = new Employee[10]; employees = generateEmployees(); for (int i = 0; i < 10; i++) { System.out.println(employees[i].toString()); } } - Brittany Gefroh
NPE 是发生在 println 本身,还是在 toString() 中?你确定 random.nextInt(4) + 1; 总是能给出 0 到 3 之间的一个值吗? - Ash
啊,这就是问题所在。我生成了1-4的随机数,但是将case设置为0-3了。现在它可以工作了。 - Brittany Gefroh

0

这是一个静态方法,因此...它不需要在实例化对象的上下文中被访问。你只需在 public static void main(...) 方法中调用它即可。如果包含 main() 方法的类名为 Employee,则...

Employee.generateEmployees(); 

这样就可以解决问题了。


0
就像Ash所说的那样,但是如果你需要处理这些记录,没有理由引入额外的变量,只需要这样做。
 public static void main(String[] args)
 {
      for(Employee employee: generateEmployees())
         print(employee); // define static print somewhere too

 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接