String: Objekt und doch kein Objekt?

lajao

Mitglied
Referenzübergabe eines String-Objekts

Im JDK besteht die Klasse String mit Konstruktor und allem was dazugehört. Dadurch bin ich bis jetzt davon ausgegangen, dass String auch wirklich ein Objekt ist und als solches zu behandeln ist.

Nun habe ich aber folgendes Problem:

Ich habe eine Methode, die mir ein Datenfeld aus der main Methode ohne Rückgabewert ändert. Bei normalen Objekten funktioniert dies auch wunderbar:

Tester:
Java:
package object;

public class ObjectTester {

	public static void main(String[] args) {
		TestObject test;
		test = new TestObject("Main Methoden-String");
		ObjectChanger changer = new ObjectChanger(test);
				
		System.out.println("String vor der Methode");
		System.out.println(test.getString());
		changer.change();		
		System.out.println("String nach der Methode");
		System.out.println(test.getString());
	}
}

Changer:
Java:
package object;

public class ObjectChanger {
  
  private TestObject test;
	
  public ObjectChanger(TestObject test){
	  this.test = test;
  }
  
  public void change(){
	  test.setString("Von der Methode erstellter String");
  }
}

TestObjekt
Java:
package object;

public class TestObject {
  private String string;
  
  public TestObject(String string){
	  this.string = string;
  }
  
  public void setString(String string){
	  this.string = string;
  }
  
  public String getString(){
	  return string;
  }
}

Ausgabe der Konsole
String vor der Methode
Main Methoden-String
String nach der Methode
Von der Methode erstellter String
also wie gewünscht


Mit String erhalte ich allerdings folgendes (komplett analoges Beispiel:

Tester:
Java:
package string;

public class StringTester {

	public static void main(String[] args) {
	  String string;
	  string = "Main Methoden-String";
	  StringChanger changer = new StringChanger(string);
	  
	  System.out.println("String vor dem Durchlaufen der Methode");
	  System.out.println(string);
	  changer.change();	  
	  System.out.println("String nach dem Durchlaufen der Methode");
	  System.out.println(string);
	}
}

Changer:
Java:
package string;

public class StringChanger {
  private String string;
  
  public StringChanger(String string){
	this.string = string;	
  }
  
  public void change(){
	  string = "Von der Methode erstellter String";	  
  }
}
Test-Objekt:
String

Ausgabe der Konsole:
String vor dem Durchlaufen der Methode
Main Methoden-String
String nach dem Durchlaufen der Methode
Main Methoden-String

Also wird bei einem String nur der Wert übergeben, nicht die Referenz?
Obwohl String eigentlich ein Objekt ist??

Woran erkenne ich solche Objekte?
Ich nehm mal an, bei Double, Integer etc. wirds nicht viel anders sein?
 
Wenn du deine Beispiel anguckst, wirst du erkennen, dass du einmal in dem Changer-Objekt ein Setter aufgerufen hat (der ja auch funktioniert hat) und ein anderes Mal versucht direkt die Referenz zu ersetzen.
Und solche Objekte erkennst du ziemlich leicht: es sind ALLE.
Call-by-value und call-by-reference wären gute Stichwörter um sich da mal genauer einzulesen
 
Alle Operationen auf String, die einen String zurückgeben, ändern diesen nicht, sondern geben einen neuen String zurück. Dies hat aber in deinem Beispiel wohl keine Relevanz.
Du kannst Objekte nicht ändern, indem du eine über einen Parameter erhaltene Referenz "umlenkst". Dies gilt für alle Typen (also nicht nur Referenz, sondern auch primitive wie int).
 
Das ist was vollkommen anderes.
Bei dem ersten Beispiel, hast du ein Objekt (TestObjekt), welches eine Referenz auf einen String enthält.
Du hohlst dir aus dem TestObjekt jedesmal die Stringreferenz.

Bei dem anderen Beispiel übergibst du dem StringChanger die Referenz auf dem Ausgangsstring, und schreibst sie in dem Objekt um, verwendest aber immer noch dem alten String.

PS: Alle Klasseninstanzen sind Objecte, da kann man nichts dagegen tun.
Ebenso wie ausnahmslos alle einen Konstruktor besitzen.
 
Du kannst Objekte nicht ändern, indem du eine über einen Parameter erhaltene Referenz "umlenkst".

ist eigentlich klar. Aus irgendeinem Grund hab ich gedacht, die main-Variabel würde auf die Changer Variabel zeigen und nicht umgekehrt..
Keine Ahnung, wie ich zu dieser Annahme gekommen bin 😳

da String ja nicht über getter und setter verfügt, werd ich wohl meinen String "verpacken" müssen.
 
Dafür könntest du ein Array mit lenght 1 nehmen. Ist nicht das schönste, aber möglich.
Das kannst du an alle Klassen verteilen, und auf Feld 0 einfach die Referenz ändern.
 

Zurück
Oben