Skip to content

Commit 591a14a

Browse files
committed
Update java-basic-questions-01.md
1 parent bda5ab0 commit 591a14a

File tree

1 file changed

+8
-3
lines changed

1 file changed

+8
-3
lines changed

docs/java/basis/java-basic-questions-01.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff 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干脆为所有成员变量提供了一个安全的默认值(如 null0),作为一种**安全兜底机制**
753758
754759
成员变量与局部变量代码示例:
755760

0 commit comments

Comments
 (0)