Java statische Methode Parameter
-
02-10-2019 - |
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?
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 ...
Es ist wohlauf. Innerhalb static Hotel doStuff(Hotel hotel)
, führen Sie eine new
Instanz von Hotel
zu schaffen, alte hotel
Referenz unverändert.