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
...因为soprano1
和soprano2
都是Soprano
- 不是Singer
。
但是,唉,输出实际上是:
Singing
Singing in the range of C4-A5
为什么? 因为静态成员没有动态调度,所以声明的类型mySoprano1
决定了sing
方法被调用......和声明的类型soprano1
是Singer
,不是Soprano
。
有关更多信息,请参阅Java Puzzlers一书中的“我得到的所有东西都是静态的”。
如果您编写MyClass.staticVariable
比myObject.staticVariable
更自我记录。 它告诉查看staticVariable
是MyClass
属性的代码的人,而不是作为类的特定实例的myObject
。
我可以想到的一点是,如果您使用Class Reference而不是Object,则JVM不需要创建new
Object来访问该静态变量。 这是一个很好的性能编程实践。