今日Java学习——对象传递 📅 发布时间:2026/9/8 18:40:39 👁 浏览次数: 一、情景引入以下代码执行后输出结果为____public class ClassTest{ String str new String(hello); char[] ch {a,b,c}; public void fun(String str, char ch[]){ strworld; ch[0]d; } public static void main(String[] args) { ClassTest test1 new ClassTest(); test1.fun(test1.str,test1.ch); System.out.print(test1.str and ); System.out.print(test1.ch); } }二、详解与答案按照代码运行顺序讲解1. 堆中分配实例对象代码从main函数开始运行执行ClassTest test1 new ClassTest();在栈中main 栈帧给局部引用变量test1分配内存在堆中给ClassTest的实例对象分配起始地址并为其成员变量str、ch也分配内存。test1指向该实例对象的地址也是说test1本身在栈中是有内存的分配的但是它存的是其实例对象的起始地址此时内存分配的简易图如下2.初始化成员变量1执行new String(hello)首先去堆内的字符串常量池查找hello不存在则创建字符串对象地址再在堆中new一个独立的 String 对象【1】String value其内部value引用指向hello字符串对象地址。(String的value存的是hello字符串对象地址)执行String str new String(hello);赋值操作堆中str存的就是value地址2同理执行char[] ch {a,b,c};堆中分配内存给a,b,c将其内存赋给堆中ch3.test1.fun(test1.str, test1.ch)test1.fun(test1.str, test1.ch)通过test1找到ClassTest类再去方法区找fun方法然后fun压入虚拟栈内创建新栈帧创建新形参局部变量strchstrch在栈中被创建分配内存此时的str和ch和之前的str与ch不一样因为被创建的所在区域不同仅仅名字相同而已。然后给形参赋值拷贝实参的值给形参此时栈中的strch分别指向value的地址和a,b,c的地址因为堆中的str和ch存的是value的地址和a,b,c的地址。4.strworld;与ch[0] d;strworld同理在堆的字符串常量池创建world字符串对象【2】String value。只修改栈中的str。堆里的成员变量完全没有被触碰依旧指向 hello。ch[0] d——栈中形参ch顺着原先在test1.fun(test1.str, test1.ch)里赋值的路径找到a,b,c的地址修改对应下标的数组元素。没有修改形参ch的地址值5.fun 方法执行结束fun栈帧整体出栈销毁栈中str和ch内存直接回收局部形参永久消失。 回到 main 方法栈帧继续执行后续的输出代码。6.总结与答案成员变量str从未被修改答案为hello and dbc个人首次发布讲解理解的细节可能错误仅供参考