scjp传递对象

时间:2011-09-13 12:25:23

标签: java scjp

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 个答案:

答案 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)

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