File tree Expand file tree Collapse file tree 1 file changed +8
-3
lines changed Expand file tree Collapse file tree 1 file changed +8
-3
lines changed Original file line number Diff line number Diff line change @@ -745,11 +745,16 @@ System.out.println(l + 1 == Long.MIN_VALUE); // true
745745
746746** 为什么成员变量有默认值?**
747747
748- 1. 先不考虑变量类型,如果没有默认值会怎样?变量存储的是内存地址对应的任意随机值,程序读取该值运行会出现意外 。
748+ 核心原因是为了保证对象状态的安全和可预测性 。
749749
750- 2. 默认值有两种设置方式:手动和自动,根据第一点,没有手动赋值一定要自动赋值。成员变量在运行时可借助反射等方法手动赋值,而局部变量不行 。
750+ 成员变量和局部变量在这个规则上不同,主要是因为它们的 ** 生命周期 ** 不一样,导致了编译器对它们的“控制力”也不同 。
751751
752- 3. 对于编译器(javac)来说,局部变量没赋值很好判断,可以直接报错。而成员变量可能是运行时赋值,无法判断,误报“没默认值”又会影响用户体验,所以采用自动赋默认值。
752+ - ** 局部变量** 只活在一个方法里,编译器能清楚地看到它是否在使用前被赋值,所以编译器会强制你必须手动赋值,否则就报错。
753+ - ** 成员变量** 是跟着对象走的,它的值可能在构造函数里赋,也可能在后面的某个 `setter` 方法里赋。编译器在编译时** 无法预测** 它到底什么时候会被赋值。
754+
755+ 并且,如果一个变量没有被初始化,它的内存里存放的就是“垃圾值”——之前那块内存遗留下的任意数据。如果程序读取并使用了这个垃圾值,就会产生完全不可预测的结果,比如一个数字变成了随机数,一个对象引用变成了非法地址,这会直接导致程序崩溃或出现诡异的 bug。
756+
757+ 为了避免你拿到一个含有“垃圾值”的危险对象,Java 干脆为所有成员变量提供了一个安全的默认值(如 null 或 0 ),作为一种** 安全兜底机制** 。
753758
754759成员变量与局部变量代码示例:
755760
You can’t perform that action at this time.
0 commit comments