关于最后两个例子个人思考,欢迎指正
Topic source修改了一下回答。
首先了解三个前提:
-
引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。
-
字符串不可变性:字符串对象创建完毕不可变,指向该对象的引用发生改变时实际上创造了新的字符串变量。
-
数组对象内数组元素如果是引用参数类型,数组元素存储的是对象的引用
第一个例子中,
String[] fullname = new String[] { "Homer", "Simpson" };
由前提3,上面这行代码,等号左边在栈内存中声明了一个fullname
变量,该变量可以存储String[]
类型对象的地址。右边在堆内存中创建了String[]
对象,对象中两个位置分别存储两个String
类型对象(注意与String[]
类型相区别)的地址。最后=
表示fullname
指向该String[]
对象(存储该对象的地址)。
p.setName(fullname);
由前提1,上行代码,表示p.name
指向fullname
所指向的对象 ,也就是String[]
类型对象,该对象内部变化,就是p.name
指向对象的变化,所以p.name
会跟着改变。
而第二个例子中,
p.setName(bob);
由前提1,p.name
已经指向了bob当前所指向的"Bob"对象。
由前提2,bob = "Alice"
创建了新的String
对象,但p.name
指向的String
对象不会变。
- 1
DittoKRS
首先了解两个前提:
引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。
字符串不可变性:字符串对象创建完毕不可变,指向该对象的引用发生改变时实际上创造了新的字符串变量。
前例中p.setName(fullname) 使p.name和fullname指向同一个String数组对象,数组对象内某item的变化直接反映到p.name。
后例中bob="Alice"实际上创建了新的对象,然而p.name所指向的对象没有发生变化。
所以重点是看引用变量所指向的对象本身有没有发生变化。