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 两次创建两块独立内存,互不影响