通过对象实例访问静态方法

Cod*_*Bad 3 java static-methods

我已经了解到,如果我们希望调用另一个类的静态方法,那么你必须在调用静态方法时编写类名.在下面的程序中,我在Employee_Impl类中创建了Employee类的对象,并使用该对象,我仍然可以访问该count方法.count如果static只使用类名访问方法,为什么它允许我在对象中使用方法?这是否意味着可以使用对象和类名来访问静态方法?

Employee.java

public class Employee{
    static int counter = 0;
    static int count(){
        counter++;
        return counter;
    }
}
Run Code Online (Sandbox Code Playgroud)

Employee_Impl.java

class Employee_Impl
    public static void main(String args[]){
        Employee obj = new Employee();
        System.out.println(obj.count());
        System.out.println(Employee.count());
        System.out.println(obj.count());        
    }
}
Run Code Online (Sandbox Code Playgroud)

output

1
2
3
Run Code Online (Sandbox Code Playgroud)

Phi*_*nov 6

编译器会自动通过调用变量的类名来替换此调用(而不是它的!).注意,即使你的对象为null,它也会工作,不会NullPointerException抛出.


and*_*ach 4

您可以这样做,因为您创建了一个实例Employee来通过它访问该方法。

静态方法的要点是允许访问可以调用的“实用方法”,而无需实例化新对象的开销。此外,这些方法可以由类的任何实例共享Employee,并且可以改变共享的静态变量或属性。例如,假设所有Employee对象的共享前缀被维护为静态属性:

public class Employee {
    private static String EMPLOYEE_IDENTIFIER_PREFIX = "Acme Corporation Employee Number:"

    public static void setEmployeeIdentifierPrefix(String prefix){
         Employee.EMPLOYEE_IDENTIFIER_PREFIX = prefix;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果是通过前缀AcmeCorporation购买的,则可以通过在类上使用 来更新所有对象,如下所示:MultinationalCorporationEmployeesetEmployeeIdentifierPrefixMethod

Employee.setEmployeeIdentifierPrefix("Multinational Corporation Employee Number:");
Run Code Online (Sandbox Code Playgroud)