Java中的静态变量

根据Java,静态变量可以通过类名访问,但即使Java不提示它们也可以通过类对象访问静态变量,并且它给出了相同的答案。

我知道只有一个变量副本,它的值对所有对象和其他东西都是一样的。 为什么Java建议使用类名而不是类对象?


因为它可能会让人迷惑! 静态成员不存在动态分派。

看看这个令人困惑的代码:(可能是语法错误;我的Java很生疏)

public abstract class Singer {
    public static void sing() {
        System.out.println("Singing");
    }
}

public class Soprano extends Singer {
    public static void sing() {
        System.out.println("Singing in the range of C4-A5");
    }
}

public class MyDriver {

    public static void main(String[] argv) {
        Singer  mySoprano1 = new Soprano();
        Soprano mySoprano2 = new Soprano();
        mySoprano1.sing();
        mySoprano2.sing();
    }

}

看着MyDriver这很让人困惑,因为它看起来像sing方法是多态的,所以输出应该是......

Singing in the range of C4-A5
Singing in the range of C4-A5

...因为soprano1soprano2都是Soprano - 不是Singer

但是,唉,输出实际上是:

Singing
Singing in the range of C4-A5

为什么? 因为静态成员没有动态调度,所以声明的类型mySoprano1决定了sing方法被调用......和声明的类型soprano1Singer ,不是Soprano

有关更多信息,请参阅Java Puzzlers一书中的“我得到的所有东西都是静态的”。


如果您编写MyClass.staticVariablemyObject.staticVariable更自我记录。 它告诉查看staticVariableMyClass属性的代码的人,而不是作为类的特定实例的myObject


我可以想到的一点是,如果您使用Class Reference而不是Object,则JVM不需要创建new Object来访问该静态变量。 这是一个很好的性能编程实践。

链接地址: http://www.djcxy.com/p/78803.html

上一篇: Static variable in Java

下一篇: Dynamic Method Lookup in Java