Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

静态变量和实例变量有什么区别?

查看完整题解

参考回答

直接回答

静态字段属于声明它的运行时类,同一个类的实例共享这份类状态;实例字段属于具体对象,每个实例分别保存自己的值。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 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。