0
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 不改变?据我了解,对对象的引用应该被传递,并且在方法中它应该被替换为新对象。

4

4 回答 4

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 <---------
于 2011-09-13T12:33:07.193 回答
1

我会在这里有点具体:与其说传递了引用,不如将其视为“通过值传递的引用”。因此,基本上,该方法接收指向所考虑对象的引用的副本。两个引用(原始h1的和新的hotel)都指向同一个对象,但仍然不同。在该方法中,您修改“引用”而不是它所引用的对象,从而修改结果。

一本不错的读物可能是作者使用不同语言的代码示例。

于 2011-09-13T12:33:15.897 回答
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

看看核心 Java。有史以来最好的书!

于 2011-09-13T12:32:31.620 回答
0

传递了对对象的引用,并且这个引用是按值传递的。这意味着传递了引用的副本。您可以修改酒店的内容,这些更改将对呼叫者可见。但是,如果您将新的酒店分配给酒店参数,则只会更改原始引用的副本。原始参考仍将指向原始酒店。

于 2011-09-13T12:33:15.003 回答