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

Java 通过对象实例访问静态方法,java,static-methods,Java,Static Methods,我已经了解到,如果我们希望调用另一个类的静态方法,那么您必须在调用静态方法时编写类名。在下面的程序中,我在Employee_Impl类中创建了Employee类的对象,并且使用该对象,我仍然能够访问count方法。如果只使用类名访问static方法,为什么允许我通过对象使用count方法?这是否意味着可以使用对象和类名访问静态方法 Employee.java public class Employee{ static int counter = 0; static int cou

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

Employee.java

public class Employee{
    static int counter = 0;
    static int count(){
        counter++;
        return counter;
    }
}
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());        
    }
}
Employee\u Impl.java

public class Employee{
    static int counter = 0;
    static int count(){
        counter++;
        return counter;
    }
}
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

允许您这样做是因为您创建了
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;
    }
}
如果
AcmeCorporation
是由
multi-nationalcorporation
购买的,则可以使用类上的
setEmployeeIdentifierPrefixMethod
更新所有
Employee
对象的前缀,如:

Employee.setEmployeeIdentifierPrefix("Multinational Corporation Employee Number:");

编译器会通过调用变量的类名自动替换此调用(不是它的值的!)。注意,即使对象为null,也不会抛出任何
NullPointerException

静态方法始终从类执行…而不是从对象执行。。。 这里..,即使您正在调用对象
obj.count()
它将仅从
Employee
类执行。。。 首先,它将识别对象的类,然后根据该对象类型执行
count()
方法。

可能的重复