Discuss / Java / 谁能解释一下最后一个例子

谁能解释一下最后一个例子

Topic source

哔哗bihua

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

我还是不明白为什么最后一个例子

 bob = "Alice"; // bob改名为Alice

        System.out.println(p.getName()); 

输出的还是bob?

当 bob = "Alice"时,会在内存中新开辟一个空间,bob的指向该变了。但是name属性还是指向原来的内存空间 还是Bob

Initialhome

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

String 类型的数据赋值后就不能被再次赋值

xuanChristy

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

你和你妈手机里都存了你爸的手机号,有一天你不小心把你叔的手机号填写进你爸的那一栏里,那么问题来了,此时此刻你妈手机里备注‘老公’的手机号是你爸的还是你叔的?

String的值是不可变的 ,对String 重新赋值的时候,会重新创建一个bob的引用;

Coca-code

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

请问,两次都输出Bob的例子,如何输出Bob.Alice?

廖家伟a

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

String bob="Bob"  //bob指向"Bob",可以把bob理解为指针

p.setName(bob) //相当于传递了一个地址,这时p.name指向"Bob"

bob="Alice" //bob指向"Alice",但是p.name的指向并未发生改变,还是指向"Bob"

蔚蓝Weinan

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

想通过python解释一下,

在python里string是不可变数据类型,相当于是一个元组,而元组不可变。

1.string 是使用副本(id不同):如果使用元组只能复制,class中使用的string其实是一个string的副本。

2.数组是引用(id相同):而[   ]是可变的,[    ]是容器,class中使用的[     ]就是通过内存地址引用原来的数组

只会点赞w

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

感觉是这样:

字符串:

 1. 定义字符串时,bob存储了字符串"Bob"在内存中的地址

String bob = "Bob" // bob -> "Bob"

 2. 实例化对象p的时候,给p.name传入了bob 存储的地址,即"Bob"在内存中的地址

p.setName(bob)  // p.name -> "Bob"

 3.  给bob赋值后,bob指向了内存中新的字符串"Alice"的地址

bob = "Alice" // bob -> "Alice" 

 4. 此时p.name仍然指向 "Bob"在内存中的地址

// p.name -> "Bob"

数组:

1. 定义数组时,由于是String数组,所以fullname[0] 存储的实际上是字符串 "Homer"的地址;同理,fullname[1] 指向 字符串"Simpson" 的地址

String[] fullname = new String[] { "Homer", "Simpson" }; // fullname[0] -> "Homer"  

2. 实例化对象p的时候,传入了fullname指向的地址,所以name[0]指向fullname[0]在内存中的地址,而fullname[0] 又指向字符串"Homer"

p.setName(fullname); //p.name[0] -> fullname[0] -> "Homer"

3. 修改fullname[0]时,就是改变 fullname[0] 的指向,修改后为fullname[0]存储的是字符串"Bart"的地址

fullname[0] = "Bart" // fullname[0] -> "Bart"

4.  而此时p.name[0] 的指向并没有变,还是指向fullname[0]所在的地址,访问p.name[0] 时先在内存中找到fullname[0],又根据fullname[0]中存储的地址信息访问到"Bart"

fullname[0] = "Bart" // p.name[0] -> fullname[0] -> "Bart"

何梓猪

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

通过画内存图可以帮助理解:快进到代码后面几句,此时bob指向了"Alice",但p还是指向"Bob",你可以试试在输出前加多一句p.setName(bob);  再把bob变量的值传递给p,这样p就指向"Alice"了。


  • 1
  • 2

Reply