Java静态方法参数

时间:2010-04-28 15:58:31

标签: java static parameters pass-by-reference pass-by-value

为什么以下代码返回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()?

5 个答案:

答案 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引用未更改。