为什么以下代码返回100 100 1 1 1
而不是100 1 1 1 1
?
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()?
答案 0 :(得分:10)
它完全按照你的要求去做: - )
Hotel h1 = new Hotel(100);
System.out.print(h1.getRoomNr() + " "); // 100
Hotel h2 = doStuff(h1);
System.out.print(h1.getRoomNr() + " "); // 100 - h1 is not changed, h2 is a distinct new object
System.out.print(h2.getRoomNr() + " "); // 1
h1 = doStuff(h2);
System.out.print(h1.getRoomNr() + " "); // 1 - h1 is now changed, h2 not
System.out.print(h2.getRoomNr() + " "); // 1
正如其他人所指出的那样(并且非常清楚地解释in this article),Java会按值传递。在这种情况下,它会将参考h1
的副本传递给doStuff
。在那里,副本被新引用覆盖(然后返回并分配给h2
),但h1
的原始值不受影响:它仍然引用第一个酒店对象,其房间号为100。
答案 1 :(得分:5)
酒店的参考值按值传递。
答案 2 :(得分:4)
因为Java 传递值。仅在这种情况下,该值是对Hotel
对象的引用。或者更清楚的是,Java传递了对h1指向的同一个Object的引用。因此,h1本身不会被修改。
答案 3 :(得分:1)
酒店参考值按值传递。您只需更改hotel
方法中的本地doStuff
变量并将其返回,而不是更改原始h1
。如果您有一个setRoomNr方法并且调用h1
,那么可以从方法中更改原始hotel.setRoomNr(1)
答案 4 :(得分:1)
一切都很好。在static Hotel doStuff(Hotel hotel)
内,您正在创建一个new
Hotel
实例,旧hotel
引用未更改。