调用/访问静态变量或方法

时间:2019-03-17 00:11:55

标签: object static instance

我正在研究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”?!

1 个答案:

答案 0 :(得分:0)

  

我了解到,当一个静态变量在一个对象中更改时,它在所有对象中都更改

您理解不正确。也就是说,首先将静态变量视为“在一个对象中” 是不正确的。

静态变量根本不是该类实例的成员。在某些语言中(例如Java,这是您在此处使用的语言),您可以通过具有相同类类型的变量访问静态成员。但是在这种情况下,您不会访问该类的实例。您仍在访问 shared 变量,该变量实际上是该类 type 的一部分,而不是该类的任何单个实例。

习惯上来说,您实际上会写Koala.count来访问示例中的count字段。

例如,当您写在您的代码中,诸如k.count之类的东西,k的值根本不相关。编译器将整个表达式解释为引用表达式Koala.count所引用的同一成员是一种语言的怪癖。即由于无需取消引用实例引用来访问count成员,因此通过具有类型Koala的任何变量进行这样做被认为是合法的,即使该变量的当前值为{{1 }}。 null被忽略,因为访问静态成员null根本不需要引用任何实例。

由于变量count的值被忽略,因此无论将其分配给类k的实际实例还是简单地称为Koala,您都会得到相同的结果。