我正在研究OCA,并且此代码在我正在使用的书中。
public class Koala {
public **static** int count = 0;
public **static** void main(String[] args) {
System.out.println(count);
}
}
Koala k = new Koala();
System.out.println(k.count); //prints 0
k = null;
System.out.println(k.count); //prints 0
我了解到,当一个静态变量在一个对象中更改时,它在所有对象中都更改。为什么最后一个println不能打印“ null”?!
答案 0 :(得分:0)
我了解到,当一个静态变量在一个对象中更改时,它在所有对象中都更改
您理解不正确。也就是说,首先将静态变量视为“在一个对象中” 是不正确的。
静态变量根本不是该类实例的成员。在某些语言中(例如Java,这是您在此处使用的语言),您可以通过具有相同类类型的变量访问静态成员。但是在这种情况下,您不会访问该类的实例。您仍在访问 shared 变量,该变量实际上是该类 type 的一部分,而不是该类的任何单个实例。
习惯上来说,您实际上会写Koala.count
来访问示例中的count
字段。
例如,当您写在您的代码中,诸如k.count
之类的东西,k
的值根本不相关。编译器将整个表达式解释为引用表达式Koala.count
所引用的同一成员是一种语言的怪癖。即由于无需取消引用实例引用来访问count
成员,因此通过具有类型Koala
的任何变量进行这样做被认为是合法的,即使该变量的当前值为{{1 }}。 null
被忽略,因为访问静态成员null
根本不需要引用任何实例。
由于变量count
的值被忽略,因此无论将其分配给类k
的实际实例还是简单地称为Koala
,您都会得到相同的结果。