谁能解释一下最后一个例子
Topic sourceString bob="Bob" //bob指向"Bob",可以把bob理解为指针
p.setName(bob) //相当于传递了一个地址,这时p.name指向"Bob"
bob="Alice" //bob指向"Alice",但是p.name的指向并未发生改变,还是指向"Bob"
想通过python解释一下,
在python里string是不可变数据类型,相当于是一个元组,而元组不可变。
1.string 是使用副本(id不同):如果使用元组只能复制,class中使用的string其实是一个string的副本。
2.数组是引用(id相同):而[ ]是可变的,[ ]是容器,class中使用的[ ]就是通过内存地址引用原来的数组
感觉是这样:
字符串:
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"
通过画内存图可以帮助理解:快进到代码后面几句,此时bob指向了"Alice",但p还是指向"Bob",你可以试试在输出前加多一句p.setName(bob);
再把bob变量的值传递给p,这样p就指向"Alice"了。
- 1
- 2
哔哗bihua
我还是不明白为什么最后一个例子
bob = "Alice"; // bob改名为Alice
System.out.println(p.getName());
输出的还是bob?