1. 对象内存理解
1.1 引用数据类型与地址值
- 1.1.1 引用类型存储的是地址值:数组、对象等引用类型变量本身不存储数据,而是存储数据在内存中的地址值,如
[I@b4c966a
- 1.1.2 null:表示引用类型变量不指向任何内存地址,打印结果为
null
1.2 对象赋值与内存共享
- 1.2.1 对象赋值的本质:将一个对象变量赋值给另一个变量时,传递的是地址值,两个变量指向同一块内存
- 1.2.2 共享内存的影响:两个变量指向同一对象时,通过任意一个变量修改属性,另一个变量访问时也会同步变化
- 1.2.3 示例:
Person p1 = new Person();
p1.age = 20;
p1.name = "张三";
Person p2 = p1; // p2 获得 p1 的地址值,两者指向同一内存
p2.name = "张帆";
System.out.println(p1.name); // 输出:张帆,而非张三
```
### 1.3 内存示意
```
p1 ──┐
├──► [ age=20, name="张帆" ]
p2 ──┘
- 1.3.1 两个变量独立 vs 共享:
new 两次会创建两块独立内存;赋值只是复制地址,仍共享同一块内存
2. 示例代码
package com.itszt.day03;
public class Demo11 {
public static void main(String[] args) {
// 引用类型直接打印输出地址值
int[] ints = {1, 2, 3, 4, 5};
System.out.println("ints = " + ints); // [I@b4c966a
// null:不指向任何内存
Person p1 = null;
Person p2 = null;
System.out.println(p1); // null
p1 = new Person();
p1.age = 20;
p1.name = "张三";
// 赋值传递地址,p1 和 p2 共享同一内存
p2 = p1;
System.out.println(p2.name); // 张三
p2.name = "张帆";
System.out.println(p1.name); // 张帆(同步变化)
}
}
class Person {
int age;
String name;
}
3. 总结
| 知识点 | 核心要点 |
|---|
| 引用类型存储 | 存储的是内存地址值,非数据本身 |
| null | 不指向任何内存地址 |
| 对象赋值 | 传递地址值,两变量共享同一内存 |
| 共享内存影响 | 任一变量修改属性,另一变量同步变化 |
| new 两次 | 创建两块独立内存,互不影响 |