object - 调用/访问静态变量或方法
问题描述
我正在为 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”?!
解决方案
我知道当一个对象中的静态变量发生变化时,它会在所有对象中发生变化
你理解错了。也就是说,您首先将静态变量视为“在一个对象中”是错误的。
静态变量根本不是类实例的成员。在某些语言中(例如您在此处使用的 Java),您可以通过与类具有相同类型的变量来访问静态成员。但在这种情况下,您不会访问该类的实例。您仍在访问真正属于类类型的共享变量,而不是该类的任何单个实例。
更惯用的说法是,您实际上会编写Koala.count
访问count
示例中的字段。
例如,当您在代码中编写类似的内容k.count
时, 的值k
根本不相关。这是编译器将整个表达式解释为引用该表达式所引用的同一成员的语言的一个怪癖Koala.count
。即,由于不需要取消引用实例引用来访问count
成员,因此通过任何具有 type 的变量这样做都被认为是合法的Koala
,即使该变量的当前值为null
. 被null
忽略,因为访问静态成员根本不需要任何实例的引用count
。
由于变量的值k
被忽略,因此无论它是分配给类的实际实例Koala
还是简单地,您都会得到相同的结果null
。
推荐阅读
- servlets - 从另一个 servlet 调用 servlet 过滤器
- c# - 在依赖注入期间使用 NLog
- javascript - Audiocontext 没有播放任何声音
- sql - SQL注入测试软件
- python - 大熊猫计算同一列的时间差?
- ios - 当有 100% 的值时,过滤 Realm 对象返回 nil
- elasticsearch - 是否可以使用 FSCrawler 将文件内容提取到 Elasticsearch 中现有索引的特定 _id
- prometheus - 如何使用正则表达式和二元运算符编写 PromQL
- python - 如何将js模块导入python?
- ios - 使用nodejs和express的应用程序,无法登录ios Iphone