Frage

Warum funktioniert der folgende Code Rückkehr 100 100 1 1 1 und nicht 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() + " ");
}
}

Warum erscheint es Hotel von-Wert doStuff () übergeben?

War es hilfreich?

Lösung

Es tut genau das, was Sie ihm gesagt, zu tun: -)

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

Wie andere bereits festgestellt (und ist sehr deutlich erklärt in diesem Artikel ), Java vergeht Wert. In diesem Fall geht es um eine Kopie der Referenz h1 zu doStuff. Dort wird die Kopie mit einer neuen Referenz überschrieben wird (die dann zurückgeführt wird und zu h2 zugewiesen), aber der ursprünglichen Wert von h1 ist davon nicht betroffen. Es verweist immer noch das erste Hotel-Objekt mit einer Zimmernummer von 100

Andere Tipps

Verweis auf Hotel ist von Wert übergeben.

Da Java hat nach Wert übergeben. Nur in diesem Fall ist der Wert ein Verweis auf ein Hotel Objekt. Oder besser klar, geht Java einen Verweis auf das gleiche Objekt, dass h1 Punkte. Daher h1 selbst wird nicht verändert.

Das Hotel Referenz wird durch Wert übergeben. Sie ändern nur die lokale hotel Variable in dem doStuff Verfahren und Zurückkehren es, nicht den ursprünglichen h1 ändern. Sie könnte die ursprünglichen h1 innerhalb der Methode ändern, wenn Sie eine setRoomNr Methode haben und hotel.setRoomNr(1) obwohl ...

genannt

Es ist wohlauf. Innerhalb static Hotel doStuff(Hotel hotel), führen Sie eine new Instanz von Hotel zu schaffen, alte hotel Referenz unverändert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top