Discuss / Java / 关于最后两个例子个人思考,欢迎指正

关于最后两个例子个人思考,欢迎指正

Topic source

DittoKRS

#1 Created at ... [Delete] [Delete and Lock User]

首先了解两个前提:

  1. 引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。

  2. 字符串不可变性:字符串对象创建完毕不可变,指向该对象的引用发生改变时实际上创造了新的字符串变量。

前例中p.setName(fullname) 使p.name和fullname指向同一个String数组对象,数组对象内某item的变化直接反映到p.name。

后例中bob="Alice"实际上创建了新的对象,然而p.name所指向的对象没有发生变化。

所以重点是看引用变量所指向的对象本身有没有发生变化。

DittoKRS

#2 Created at ... [Delete] [Delete and Lock User]

今天再看,说得不太对,数组元素是引用类型(字符串)的话,应该相当于一个指针,指向某String对象

DittoKRS

#3 Created at ... [Delete] [Delete and Lock User]

修改了一下回答。

首先了解三个前提:

  1. 引用类型参数的传递,调用方的变量,和接收方的参数变量,指向的是同一个对象。

  2. 字符串不可变性:字符串对象创建完毕不可变,指向该对象的引用发生改变时实际上创造了新的字符串变量。

  3. 数组对象内数组元素如果是引用参数类型,数组元素存储的是对象的引用

第一个例子中,

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

Reply