【问题标题】:Accessing static method through an object instance通过对象实例访问静态方法
【发布时间】:2015-08-16 20:34:27
【问题描述】:

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

Employee.java

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

output

1
2
3

【问题讨论】:

标签: java static-methods


【解决方案1】:

编译器会自动用你的变量的类名替换这个调用(不是它的值!)。请注意,即使您的对象为 null,it will work,也不会抛出 NullPointerException。

【讨论】:

    【解决方案2】:

    您可以这样做,因为您创建了一个 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 是由MultinationalCorporation 购买的,则可以使用类上的setEmployeeIdentifierPrefixMethod 为所有Employee 对象更新前缀,如下所示:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2012-10-07
        • 1970-01-01
        • 1970-01-01
        • 2012-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 1970-01-01
        相关资源
        最近更新 更多