静态变量和实例变量有什么区别?
查看完整题解
参考回答
直接回答
静态字段属于声明它的运行时类,同一个类的实例共享这份类状态;实例字段属于具体对象,每个实例分别保存自己的值。static 不等于常量,也不等于线程安全。讨论“只有一份”时,还需限定运行时类身份,不能忽略不同定义类加载器可能加载同名类。
讲清原理
例如计数器可以表示这个类创建过多少对象,而每个对象的 name 则各不相同。类状态与对象状态的生命周期、初始化位置和访问方式不同,不能把某个 JVM 版本中的内存区域布局当成语言定义。
子类能通过名称访问继承的静态字段,也不代表它自动获得了一份父类字段副本。如果子类另行声明同名字段,那是隐藏,应另行分析。
例子与易错点
class Item {
static int count;
int value;
Item(int value) { this.value = value; count++; }
}
Item a = new Item(3);
Item b = new Item(8);
System.out.println(Item.count + ":" + a.value + ":" + b.value);
// 2:3:8
这里 count 的递增没有并发保护。让全局用户信息、请求上下文等放进静态可变字段,可能造成串数据,不能只因为访问方便就这样设计。
相关题:第 5 题、第 35 题、第 37 题、第 46 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。