深入理解Java对象引用:地址、拷贝与传递机制
1. Java对象本质是内存地址
在Java中,所有对象变量存储的都是对象在内存中的地址引用(而非对象本身)。这解释了为什么多个变量可以指向同一个对象实例:
java
Home home = new Home();
Cat mimi = new Cat();
home.cat = mimi; // 赋值的是mimi的内存地址
home.cat2 = mimi; // 两个属性指向同一只猫

2. 深拷贝 vs 浅拷贝
浅拷贝只复制外层引用,内层对象仍共享:
java
// 浅拷贝:两个Home指向同一只Cat
static Home shallowCopy(Home home) {
Home newHome = new Home();
newHome.cat = home.cat; // 复制地址引用
return newHome;
}

深拷贝创建完全独立的对象树:
java
static Home deepCopy(Home home) {
Home newHome = new Home();
Cat newCat = new Cat();
newCat.name = new String(home.cat.name); // 克隆字符串
newHome.cat = newCat; // 指向全新对象
return newHome;
}

3. 方法参数传递机制
Java严格采用值传递:
- 基本类型传递值的副本(不影响原值)
- 对象类型传递引用的副本(可修改对象内容)
java
// 基本类型:传值(不影响外部变量)
void addOne(int i) { // 接收的是i的副本
i = i + 1; // 修改不影响原值
}
// 对象类型:传引用副本(可修改对象内容)
void renameCat(Cat cat) { // 接收引用副本
cat.name = "咪咪"; // 修改真实对象
}


4. 基本类型 vs 引用类型
特性 | 基本类型 (int等) | 引用类型 (Object) |
---|---|---|
存储内容 | 实际数值 | 对象的内存地址 |
赋值方式 | 值复制 | 地址引用复制 |
内存分配 | 栈内存 | 堆内存 + 栈引用 |
示例 | int a = 10; |
Cat c = new Cat(); |