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

6
我学到了,如果我们想调用另一个类的静态方法,那么在调用静态方法时必须写上类名。在下面的程序中,我在Employee_Impl类内部创建了Employee类的对象,并使用该对象仍然可以访问count方法。如果静态方法只能使用类名访问,为什么它允许我通过对象使用count方法呢?这是否意味着静态方法既可以使用对象也可以使用类名来访问呢?
public class Employee{
    static int counter = 0;
    static int count(){
        counter++;
        return counter;
    }
}

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());        
    }
}

输出

1
2
3

3个回答

9
编译器会自动将此调用替换为您的变量的类名(而不是它的值!)。请注意,即使您的对象为空,它也可以工作,不会抛出NullPointerException

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;
    }
}

如果 AcmeCorporationMultinationalCorporation 收购,可以使用类上的 setEmployeeIdentifierPrefixMethod 方法更新所有 Employee 对象的前缀,如下所示:
Employee.setEmployeeIdentifierPrefix("Multinational Corporation Employee Number:");

0

静态方法总是从类中执行...而不是从对象中执行... 在这里,即使您在对象obj.count()上调用count()方法, 它也只会从Employee类中执行... 首先它会识别对象的类,然后从该对象类型执行count()方法。


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