3

次のコードが返され、返さ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()に渡すように見えるのはなぜですか?

4

5 に答える 5

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

他の人が指摘したように(そしてこの記事で非常に明確に説明されています)、Javaは価値を渡します。この場合、参照のコピーをに渡しh1ますdoStuff。そこで、コピーは新しい参照で上書きされます(その後、返され、に割り当てられh2ます)が、の元の値h1は影響を受けません。それでも、部屋番号が100の最初のHotelオブジェクトを参照します。

于 2010-04-28T16:02:33.067 に答える
5

ホテルへの参照は値で渡されます。

于 2010-04-28T16:01:14.547 に答える
4

Java値を渡すからです。この場合のみ、値はHotelオブジェクトへの参照です。または、より明確にするために、Javaはh1が指す同じオブジェクトへの参照を渡します。したがって、h1自体は変更されません。

于 2010-04-28T16:00:51.073 に答える
1

ホテルの参照は値で渡されます。メソッド内のローカルhotel変数を変更doStuffして返すだけで、元の変数は変更しませんh1。setRoomNrメソッドがあり、呼び出された場合は、メソッド内から元のメソッドを変更できます...h1hotel.setRoomNr(1)

于 2010-04-28T16:03:44.650 に答える
1

順調です。内部では、のインスタンスをstatic Hotel doStuff(Hotel hotel)作成していますが、古い参照は変更されていません。newHotelhotel

于 2010-04-28T16:08:44.937 に答える