深入理解Java对象引用:地址、拷贝与传递机制

深入理解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();

相关推荐
vx_BS813301 天前
【直接可用源码免费送】计算机毕业设计精选项目03574基于Python的网上商城管理系统设计与实现:Java/PHP/Python/C#小程序、单片机、成品+文档源码支持定制
java·python·课程设计
2601_949868361 天前
Flutter for OpenHarmony 电子合同签署App实战 - 已签合同实现
java·开发语言·flutter
达文汐1 天前
【困难】力扣算法题解析LeetCode332:重新安排行程
java·数据结构·经验分享·算法·leetcode·力扣
培风图南以星河揽胜1 天前
Java版LeetCode热题100之零钱兑换:动态规划经典问题深度解析
java·leetcode·动态规划
启山智软1 天前
【中大企业选择源码部署商城系统】
java·spring·商城开发
我真的是大笨蛋1 天前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怪兽源码1 天前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
恒悦sunsite1 天前
Redis之配置只读账号
java·redis·bootstrap
梦里小白龙1 天前
java 通过Minio上传文件
java·开发语言
人道领域1 天前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql