Java Verständnisfrage Objekte und deren Referenzen

abraxus14

Cadet 4th Year
Registriert
Mai 2007
Beiträge
102
PHP:
public class Main {


	static Dog someDog2;
	public static void main(String[] args) {

		Dog myDog = new Dog("Rover");
		System.out.println(myDog.name);//Ausgabe:Rover
		foo(myDog);
		System.out.println(myDog.name);//Problemzeile!!//Ausgabe:Max Hier müsste aus meiner Sicht Rowlf stehen

	}
	
	public static void foo(Dog someDog) {
		
	    someDog.setName("Max");     // AAA
	    System.out.println(someDog.name);//Ausgabe:Max
	    someDog2= new Dog("Fifi");  // BBB
	    someDog =someDog2;//Problem ist hier
	    System.out.println(someDog.name);//Ausgabe:Fifi
	    someDog.setName("Rowlf");   // CCC	
	    System.out.println(someDog.name);//Ausgabe:Rowlf
	    System.out.println(someDog2.name);//Ausgabe:Rowlf

	}

}

Warum bleibt nach der Erstellung des zweiten Dogs in der foo Methode die Referenz nach Verlassen der Methode nicht auf dem zweiten Objekt bestehen?
 
Mit someDog = someDog2; biegst du nur die lokale Referenz der Methode um, das Original außerhalb der Methode bleibt jedoch unangetastet.
 
Du erstellst ein neues Dog-Objekt und überschreibst mit: someDog =someDog2; die Referenz auf deinen myDog. Also ab hier ändert sich dann nichts mehr bei deinem mydog.
 
abraxus14 schrieb:
Warum bleibt nach der Erstellung des zweiten Dogs in der foo Methode die Referenz nach Verlassen der Methode nicht auf dem zweiten Objekt bestehen?
Weil sie (wie alle Parameter in Java) by-value übergeben wird. D. h. "myDog" und "someDog" sind zwei unterschiedliche Referenzen, die zu Beginn von "foo" auf das selbe Objekt zeigen. Nach der Zuweisung in Zeile 19 zeigt "someDog" auf ein neues Objekt. Da sich Parameter aber wie lokale Variablen verhalten bekommt "main" nichts davon mit.
 
morgen vergisst diese erkenntnis wieder :) merk dir einfach, dass du parametern keine neue werte zuweisen sollst.

in deinem fall übergibst du ja als parameter ein objekt vom typ Dog an foo - drum nutze seine schnittstellen ( .setName() ) zur modifikation auf. falls du das feature aus zeile 19 trotzdem haben willst, schau hier.
 
Zuletzt bearbeitet:
Zurück
Oben