public class Hotel {
private int roomNr;
public Hotel(int roomNr) {
this.roomNr = roomNr;
}
public int getRoomNr() {
return this.roomNr;
}
static Hotel doStuff(Hotel hotel) {
hotel = new Hotel(1);
return hotel;
}
public static void main(String args[]) {
Hotel h1 = new Hotel(100);
System.out.print(h1.getRoomNr() + " ");
Hotel h2 = doStuff(h1);
System.out.print(h1.getRoomNr() + " ");
System.out.print(h2.getRoomNr() + " ");
h1 = doStuff(h2);
System.out.print(h1.getRoomNr() + " ");
System.out.print(h2.getRoomNr() + " ");
}
}
调用doStuff(h1)后为什么h1不会改变? 据我所知,应该传递对象的引用,并且在方法中它应该被替换为新对象。
答案 0 :(得分:1)
在这部分
static Hotel doStuff(Hotel hotel) {
hotel = new Hotel(1);
return hotel;
}
变量hotel
是一个新的局部变量,接收参考值。这个新的局部变量在第一行加载了对新Hotel
实例的新引用,并返回这个新引用。
外部本地变量h1
不会改变。
main:h1 = 0x0000100 (the old Hotel's address)
|
copying
|
-------> doStuff:hotel = 0x0000100 (the method call)
doStuff:hotel = 0x0000200 (the new Hotel's address)
|
copying
|
main:h2 = 0x0000200 <---------
答案 1 :(得分:1)
我在这里有点具体:不是说引用被传递,而是将其视为“通过值传递的引用”。所以基本上,该方法接收指向所考虑的对象的参考的副本。两个引用(原始h1
和新hotel
)都指向同一个对象但仍然不同。在该方法中,您修改“引用”而不是它引用的对象,从而修改结果。
好的阅读可能是this one,其中作者使用不同语言的代码示例。
答案 2 :(得分:0)
因为对象是“通过值传递,而不是通过引用传递”。
什么是值传递,是它的参考。所以,在你的眼里,你认为它是通过参考传递的。
所以,为了说清楚,当你将一个对象传递给一个方法时,会产生一个新的“指针引用”,然后传递它。所以,如果你修改它,没有任何反应。
编辑:这里有一些代码
Hotel h1 = new Hotel(100); // h1 holds a reference to a Hotel object in memory
System.out.print(h1.getRoomNr() + " ");
Hotel h2 = doStuff(h1); // when doStuff is called, a new reference pointing to the same object is made, but if you change it, nothing will happen
看看Core Java。有史以来最好的书!
答案 3 :(得分:0)
传递对象的引用,并且该引用按值传递。这意味着传递了引用的副本。您可以修改酒店的内容,并且呼叫者可以看到这些更改。但是,如果您将新酒店分配给酒店参数,则只会更改原始参考的副本。原始参考文献仍将指向原始酒店。