首页 > 解决方案 > 调用/访问静态变量或方法

问题描述

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

标签: objectstaticinstance

解决方案


我知道当一个对象中的静态变量发生变化时,它会在所有对象中发生变化

你理解错了。也就是说,您首先将静态变量视为“在一个对象中”是错误的。

静态变量根本不是类实例的成员。在某些语言中(例如您在此处使用的 Java),您可以通过与类具有相同类型的变量来访问静态成员。但在这种情况下,您不会访问该类的实例。您仍在访问真正属于类类型的共享变量,而不是该类的任何单个实例。

更惯用的说法是,您实际上会编写Koala.count访问count示例中的字段。

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

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


推荐阅读