应用于示例的静态方法与实例方法

Static Method vs Instance Method applied to an example

鉴于这门课

  public class Worker
private String name;
private static int WorkerCount = 0; // number of workers

public Worker(<*parameter list* >)
{
<*initialization of private instances variables* >
Worker++; //increment count of all worker
}

}

如果我要添加方法...

public static int getWorkerCount()
{
return WorkerCount;}

我刚刚添加静态而不是实例的方法如何? 我认为它可以是一个实例方法,因为它对 "WorkerCount" 的 单个对象 进行操作,该对象最初等于 0。

该方法应该是静态的,以允许在 class 级别访问员工计数。

由于 employeeCount 变量是静态的,方法主体已经为此功能设置。您可能希望这样,因为它会计算使用该构造函数初始化的 Employee 对象的总数。

另外值得注意的是 employeeCount 是一个原始值(一个 int),不应被称为对象。

更多的是应该能够调用方法而不是它访问多少对象等问题

static 字段和方法属于 Class 而不是特定的 实例 。因此无论你实例化多少次Employee,都会恰好有一个int employeeCount。每个员工对 employeeCount 字段的引用都返回到相同的位置。通过使用 employeeCount 字段,您已经得到了这个,这只是将相同的逻辑应用于方法的问题。

通过使 getEmployeeCount() 静态,您是说不仅任何员工都可以调用它,Employee class 本身也可以调用该方法;您不需要实例来调用该方法。

Employee.getEmployeeCount(); //Valid, because getEmployeeCount() is static
Employee.name; //Invalid (non-static reference from static context) because *which* employee's name?

因为它只是访问静态字段,所以这是有道理的。无论您在哪个实例上调用它,它都会 return 相同的值。考虑代码:

Employee a = new Employee();
Employee b = new Employee();

System.out.println(a.getEmployeeCount()); //2
System.out.println(b.getEmployeeCount()); //2
System.out.println(Employee.getEmployeeCount()); //2

Employee c = new Employee();

System.out.println(a.getEmployeeCount()); //3
System.out.println(b.getEmployeeCount()); //3
System.out.println(c.getEmployeeCount()); //3
System.out.println(Employee.getEmployeeCount()); //3

没有什么可以阻止您使 getEmployeeCount() 成为非静态的。但是,因为调用该方法的实例根本不重要(事实上,您甚至不需要实例),所以将方法 static.