为什么我们可以通过Java中的对象引用访问静态变量,如下面的代码?
public class Static {
private static String x = "Static variable";
public String getX() {
return this.x; // Case #1
}
public static void main(String[] args) {
Static member = new Static();
System.out.println(member.x); // Case #2
}
}
Run Code Online (Sandbox Code Playgroud)
kba*_*kba 10
通常,每个人都可以访问公共变量,并且只能从类的当前实例中访问私有变量.在您的示例中,您可以x
从main
方法中访问变量,因为该方法位于Static类中.
如果您想知道为什么允许您从另一个静态类实例访问它而不是您当前所在的实例(通常不允许私有变量),那只是因为静态变量不存在于每个实例,但基于每个类.这意味着可以从A的所有实例访问A的相同静态变量.
如果不是这种情况,那么任何人都无法访问私有静态变量,因为它不属于一个实例,而是属于所有实例.
允许它的原因是 JLS 说它是。允许这样做的特定部分是JLS 6.5.6.2(对于这些member.x
情况)和JLS 15.11.1(对于这两种情况)。后者说:
如果字段是静态的:
如果该字段是非空的 final 字段,则结果是作为 Primary 表达式类型的类或接口中指定的类变量的值。
如果该字段不是 final,或者是一个空白 final 并且字段访问发生在类变量初始化器(第 8.3.2 节)或静态初始化器(第 8.7 节)中,则结果是一个变量,即指定的类变量在作为 Primary 表达式类型的类。
为什么 JLS 允许这些?
坦白说,我不知道。我想不出有什么好的理由允许他们。
无论哪种方式,使用引用或this
访问静态变量都是一个坏主意,因为大多数程序员可能会误以为您正在使用实例字段。这是不使用 Java 的这个特性的一个强有力的理由。
在第一种和第二种情况下,您应该将变量引用为x
或Static.x
而不是member.x
。(我更喜欢Static.x
。)
归档时间: |
|
查看次数: |
21268 次 |
最近记录: |