根据 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
和都是-notsoprano2
的实例。Soprano
Singer
但唉,输出实际上是:
Singing
Singing in the range of C4-A5
为什么?因为静态成员上没有动态分派,所以声明的类型mySoprano1
决定了调用哪个sing
方法……而声明的类型soprano1
是Singer
,不是Soprano
。
有关更多信息,请查看Java Puzzlers中的 Puzzle 48 “All I get is static” 。
如果你写的话,它MyClass.staticVariable
比myObject.staticVariable
. 它告诉查看代码的人staticVariable
是 的属性MyClass
,而不是myObject
类的特定实例。
我能想到的一点是,如果您使用类引用而不是对象,JVM 根本不需要创建new
对象来访问该静态变量。这是提高性能的良好编程实践。