对象参数传递中 栈和堆的内存分析

对象内存的理解
(1)对象数据存放在堆里面,
(2)基本类型的变量和对象的引用变量都在函数的栈内存中分配。
 
特别的 :
1.数组是对象。
2.String类型是特殊类型

下面有个例子:
String str = new String("good");
String str2 ="123";
Main ex = new Main
ex.change(ex.str,ex.str2);
System.out.print(ex.str);
System.out.println(ex.str2);

public void change(String str3,String str4) {
        str3 = "test ok";
        str4= "456";
    }
结果: good123
分析输出过程:
str 是一个对象的引用。 Good 存放在栈,当调 change 是引用传递,实际上 str 赋值给了成员变量 str3, 于是引用 str3 指向对象,当 str3 = "test ok"; 时候,实际上新生成了一个 String 对象, str3 指向新的对象,由于原来的对象还是持有强引用 str ,所以不会回收,打印出来的仍然是 good
第二个123字符串存放在栈区, 123 传入 change 实际上是值传递, str4 刚开始指向栈区的 123 ,当 str4= "456"; 就会在栈区另外开辟一个地址存放 456 str4 指向该地址,所以输出的还是 123

你可能感兴趣的:(Java)