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

Core Javaを見てください。史上最高の本!

于 2011-09-13T12:32:31.620 に答える
0

オブジェクトへの参照が渡され、この参照は値によって渡されます。これは、参照のコピーが渡されることを意味します。ホテルのコンテンツを変更することができ、これらの変更は発信者に表示されます。ただし、ホテル引数に新しいホテルを割り当てると、元の参照のコピーのみが変更されます。元の参照は引き続き元のホテルを指します。

于 2011-09-13T12:33:15.003 に答える