From 6b7735f9536a30d05b0b65af27b003c5634e45a8 Mon Sep 17 00:00:00 2001 From: Wang Xiaoqing Date: Tue, 3 Oct 2023 09:55:04 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=97=AE=E9=A2=98=EF=BC=9A?= =?UTF-8?q?=E4=B8=BA=E4=BB=80=E4=B9=88=E6=88=90=E5=91=98=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E6=9C=89=E9=BB=98=E8=AE=A4=E5=80=BC=EF=BC=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/java/basis/java-basic-questions-01.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/java/basis/java-basic-questions-01.md b/docs/java/basis/java-basic-questions-01.md index 77badcfb..d0b16824 100644 --- a/docs/java/basis/java-basic-questions-01.md +++ b/docs/java/basis/java-basic-questions-01.md @@ -681,6 +681,17 @@ System.out.println(l + 1 == Long.MIN_VALUE); // true - **生存时间**:从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动生成,随着方法的调用结束而消亡。 - **默认值**:从变量是否有默认值来看,成员变量如果没有被赋初始值,则会自动以类型的默认值而赋值(一种情况例外:被 `final` 修饰的成员变量也必须显式地赋值),而局部变量则不会自动赋值。 +> 问:为什么成员变量有默认值? +> +> 答: +> +> 1. 先不考虑变量类型,如果没有默认值会怎样?变量存储的是内存地址对应的任意随机值,程序读取该值运行会出现意外。 +> +> 2. 默认值有两种设置方式:手动和自动,根据第一点,没有手动赋值一定要自动赋值。成员变量在运行时可借助反射等方法手动赋值,而局部变量不行。 +> +> 3. 对于编译器(javac)来说,局部变量没赋值很好判断,可以直接报错。而成员变量可能是运行时赋值,无法判断,误报“没默认值”又会影响用户体验,所以采用自动赋默认值。 +> + 成员变量与局部变量代码示例: ```java