|
|
@@ -64,8 +64,58 @@
|
|
|
对象名.成员方法(); // 调用方法
|
|
|
```
|
|
|
|
|
|
+### 5. 成员变量(Member Variable)与局部变量(Local Variable)区别
|
|
|
+
|
|
|
+**文件**:`Demo03.java`
|
|
|
+
|
|
|
+| 对比维度 | 成员变量 | 局部变量 |
|
|
|
+|---------|---------|---------|
|
|
|
+| **类中位置** | 定义在【类内部,方法外部】 | 定义在【方法内部】(方法的参数也属于局部变量) |
|
|
|
+| **内存位置** | 堆内存(Heap)中 | 栈内存(Stack)中 |
|
|
|
+| **生命周期** | 随着对象的存在而存在,随着对象的消失而消失 | 随着方法的调用而存在,随着方法的调用结束而消失 |
|
|
|
+| **初始化值** | 有默认初始化值(整数→0,引用类型→`null`) | 没有默认初始化值,必须先定义赋值才能使用 |
|
|
|
+
|
|
|
+```java
|
|
|
+public class Student {
|
|
|
+ String name; // 成员变量 —— 在类内部、方法外部
|
|
|
+ int age; // 成员变量
|
|
|
+
|
|
|
+ public void study() {
|
|
|
+ String msg = "学习中"; // 局部变量 —— 在方法内部
|
|
|
+ System.out.println(msg);
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
---
|
|
|
|
|
|
+### 6. 对象引用与内存共享
|
|
|
+
|
|
|
+**文件**:`Demo03.java`
|
|
|
+
|
|
|
+当多个引用变量指向 **同一个内存地址** 时,它们操作的是同一块内存空间。任何一个引用修改了数据,其他引用获取到的都是修改后的数据。
|
|
|
+
|
|
|
+```java
|
|
|
+public class Demo03 {
|
|
|
+ public static void main(String[] args) {
|
|
|
+ Teacher t1 = new Teacher(); // t1 引用指向 0x1024
|
|
|
+ t1.name = "张三";
|
|
|
+ t1.sleep(); // 输出:张三在休息....
|
|
|
+
|
|
|
+ Teacher t2 = t1; // t2 也指向 0x1024(与 t1 同一对象)
|
|
|
+ t2.name = "李四";
|
|
|
+ t2.id = "1001";
|
|
|
+ t1.sleep(); // 输出:1001李四在休息....(已被 t2 修改)
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
+
|
|
|
+> **图解**:`t1` 和 `t2` 是两个不同的引用变量,但存储的是同一个对象的地址 `0x1024`。通过 `t2.name = "李四"` 修改后,`t1.name` 也变成"李四",因为它们是同一块内存。
|
|
|
+
|
|
|
+---
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
## 二、代码实战:类与对象完整示例
|
|
|
|
|
|
### 1. Student 学生类
|
|
|
@@ -230,13 +280,15 @@ public class TeacherTest {
|
|
|
| 6 | 调用成员 | `对象名.成员变量` / `对象名.成员方法()` | `Demo02.java`, `TeacherTest.java` |
|
|
|
| 7 | 多对象创建 | 一个类可创建多个独立对象 | `Demo02.java` |
|
|
|
| 8 | 对象地址 | 直接输出对象得到 `类型@哈希码` | `TeacherTest.java` |
|
|
|
+| 9 | 成员变量 vs 局部变量 | 四维对比:位置、内存、生命周期、初始化值 | `Demo03.java` |
|
|
|
+| 10 | 对象引用与内存共享 | 多个引用指向同一内存地址,修改互相影响 | `Demo03.java` |
|
|
|
|
|
|
---
|
|
|
|
|
|
## 五、拓展阅读
|
|
|
|
|
|
-1. **堆与栈内存**:对象存储在堆(Heap)中,引用变量存储在栈(Stack)中
|
|
|
-2. **构造方法**:`new 类名()` 实际上是调用类的构造方法,默认有无参构造
|
|
|
-3. **封装性**:使用 `private` 关键字隐藏属性,通过 `getter/setter` 访问
|
|
|
-4. **this 关键字**:当成员变量与局部变量重名时,用 `this` 区分
|
|
|
-5. **匿名对象**:`new Student().study();` —— 没有名字的对象,用后即弃
|
|
|
+1. **构造方法**:`new 类名()` 实际上是调用类的构造方法,默认有无参构造
|
|
|
+2. **封装性**:使用 `private` 关键字隐藏属性,通过 `getter/setter` 访问
|
|
|
+3. **this 关键字**:当成员变量与局部变量重名时,用 `this` 区分
|
|
|
+4. **匿名对象**:`new Student().study();` —— 没有名字的对象,用后即弃
|
|
|
+5. **null 与 NullPointerException**:引用变量可以不指向任何对象(`null`),调用该引用的成员会报空指针异常
|