Variable ändert sich nicht

Hallo Experten,

der Nichtexperte hat eine Frage:

Es gibt da eine Klasse abc. In dieser Klasse wird eine Liste erstellt.
Hier der verkürze Code:

public class abc{
 private String var1;

 privat setzeVar1{
 // hier wird var1 initialisiert
 var1 = "Ein String";
 }

 public List irgendwas() { 
 List myList = new LinkedList();
 String var2 = var1;

 // hier wird die Variable var2 geändert
 var2 = "Noch ein String";
 // und dann in die Liste gelegt

 myNewEntry = new abc();
 myNewEntry.var1 = var2;
 myList.add(myNewEntry);

 // hier soll var2 auf var1 zurückgesetzt werden
 var2 = var1;

 // \*\*\* hier kommt die Frage \*\*\*
 // var2 enthält nicht - wie ich erwarte - "Ein String"
 // sondern "Noch ein String"
}

*** hier kommt die Frage ***
Anscheinend wird var1 beim Ändern von var2 auch geändert, denn nach var2 = var1 hat sich nix geändert, d.h. var1 hat den gleichen Inhalt wie var2, var2 wurde nicht auf den ursprünglichen Wert von var1 zurückgesetzt.

  • Warum ist das so?
  • Wie kann ich das umgehen?

Vielen Dank für für einen Java-Anfänger verständliche Antworten

Manfred

Hallo Manfred,

// var2 enthält nicht - wie ich erwarte - „Ein String“
// sondern „Noch ein String“

bring erst einmal deinen Beispielcode in Ordnung; der ist voller Fehler und kompiliert so nicht. Ansonsten sehe ich nicht, warum var2 nicht „Ein String“ sein sollte.

Andreas

Hallo Andreas,

bring erst einmal deinen Beispielcode in Ordnung; der ist
voller Fehler und kompiliert so nicht.

Was ist falsch?

Ansonsten sehe ich
nicht, warum var2 nicht „Ein String“ sein sollte.

Das sehe ich ja auch nicht, darum meine Frage :smile:

Manfred

Hi,

Was ist falsch?

damit geht’s los:

abc.java:4: ';' expected
 privat setzeVar1{
 ^
abc.java:27: reached end of file while parsing
}
 ^
2 errors

Dann sind List und LinkedList nicht deklariert, myNewEntry ebenso, …

Andreas

Korrigierter Code - Variable ändert sich nicht
Hallo Andreas,

der (von mir gepostete) Code erhebt keinen Anspruch auf Lauffähigkeit. Das schrieb ich auch:

Hier der verkürze Code:

Ja,

privat setzeVar1(){
 // hier wird var1 initialisiert
 var1 = "Ein String";
}

wäre richtig. Hat aber mit dem eigentlichen Fehler nichts zu tun.
Natürlich sind List und LinkedList in meinem Code deklariert durch entsprechende import-Anweisungen.

Wenns denn hilft bei der Fehlersuche hier der korrigierte Code:

import java.util.LinkedList;
import java.util.List;

public class abc{
 private String var1;
 private abc myNewEntry;

 privat setzeVar1(){
 // hier wird var1 initialisiert
 var1 = "Ein String";
 }

 public List irgendwas() { 
 List myList = new LinkedList();
 String var2 = var1;

 // hier wird die Variable var2 geändert
 var2 = "Noch ein String";
 // und dann in die Liste gelegt

 myNewEntry = new abc();
 myNewEntry.var1 = var2;
 myList.add(myNewEntry);

 // hier soll var2 auf var1 zurückgesetzt werden
 var2 = var1;

 // \*\*\* hier kommt die Frage \*\*\*
 // var2 enthält nicht - wie ich erwarte - "Ein String"
 // sondern "Noch ein String"
}

Noch einmal: Dies ist nicht der Code der kompletten Klasse. Das würde den Rahmen hier sprengen.

Zusatzfrage:
Kann der Fehler eventuell damit zusammenhängen, dass in Java die Klasse durch Zeiger definiert ist (oder wie soll ich’s ausdrücken) und durch myNewEntry = new abc();„alles verändert“ wird, auch die neue Instanz myNewEntry und das „Original“? Oder verstehe ich das alles falsch?
Ich bitte um Hilfe. Und: ich bin Anfänger :smile:

Manfred

Hallo Manfred,

Noch einmal: Dies ist nicht der Code der kompletten Klasse.
Das würde den Rahmen hier sprengen.

du kannst jede Klasse auf das Wesentliche reduzieren, um den Fehler zu zeigen. Oft genug verschwindet beim Reduzieren auch der Fehler und man findet so heraus, was man übersehen hat.

Ich habe nachgefragt, weil ich, als ich deinen Code in (für mich) offensichtlicher Weise lauffähig gemacht habe, das erwartete Ergebnis ohne Fehler erhielt …

Deswegen: Nur, wenn du uns eine komplett übersetzbare Klasse lieferst, haben wir eine Chance, dir weiterzuhelfen. (Dein „korrigierter“ Code erfüllt diese Anforderung immer noch nicht. Wirf doch mal einen Java-Compiler an, bevor du hier weiteren Code postest.)

Kann der Fehler eventuell damit zusammenhängen, dass in Java
die Klasse durch Zeiger definiert ist (oder wie soll ich’s
ausdrücken)

Ich weiß auch nicht, wie du’s ausdrücken sollst, aber Zeiger gibt es in Java nicht.

und durch myNewEntry = new abc();„alles
verändert“ wird, auch die neue Instanz myNewEntry und das
„Original“?

Welches Original? Eine andere Instanz der Klasse? Nein, die sind unabhängig voneinander, wenn man nichts weiter tut. (Vielleicht hast du in deinem Originalcode statische Felder benutzt oder ähnliches; dann wäre das etwas anderes.)

Bitte mach deine Klasse abc lauffähig. Wenn dann immer noch der Fehler auftritt, helfe ich dir gerne weiter.

Viele Grüße,

Andreas

Danke
Hallo Andreas,

danke für Deine Geduld.
Ich sehe ein, dass mir so schwer zu helfen ist.
Ich habe hier leider keine Enwicklungsumgebung.
Ich melde mich später noch mal.

Manfred :smile:

hallo

private String var1;

var1 ist also statisch. bedeutet: diese variable gibt es genau einmal im klassenkontext. egal ob du direkt mit „var1“ oder mit „new abc().var1“ oder sonstwie zugreifst, es ist immer die gleiche variable.

im endeffekt macht dein code also:

String a = „a“;
String b = a;
a = b;

logisch, dass beide variablen den selben wert haben.

wenn du das static wegnimmst, wird aus der statischen variable ein feld, das an eine objektinstaz gebunden ist. dann kannst du aber auch nicht mehr ausserhalb eines instanzkontextes auf die variable zugreifen (also aus keiner static-methode).

lg
erwin

Hallo Erwin,

wenn du das static wegnimmst

*Augen reib* Wo hast du denn das „static“ gesehen?

Gruß,

Andreas

Jetzt hab ich’s
Hallo,

ich muss mich nochmals korrigieren.
var1 und var2 sind nicht einfache Strings, sondern Stringarrays String[][] var1 bzw. String[][] var2).
Beim Kopieren von var1 nach var2 mit var2 = var1 wird einscheinend für var2 ein Zeiger auf var1 gesetzt. Dass sich dann beide ändern, ist nicht verwunderlich.
Nachdem ich die Variablen durch kopieren der Felder in einer for-Schleife zugewiesen habe, funktioniert’s auch.

Vielleicht geht das auch einfacher. Wenn ja, bin ich für Vorschläge offen.

Nochmals Danke. Problem gelöst.

Manfred

Hallo,

Beim Kopieren von var1 nach var2 mit var2 = var1 wird
einscheinend für var2 ein Zeiger auf var1 gesetzt.

ersetze „Zeiger“ durch „Referenz“, dann bist du in der Java-Welt. Wenn es nicht um atomare Werte geht, werden in Java immer nur Referenzen kopiert/zugewiesen.

Jetzt weißt du auch, warum es wichtig ist, funktionierende Beispiele zu präsentieren.

Viele Grüße,

Andreas

1 Like

Hallo Andreas,

vielen Dank für das aufschlussreiche Statement.
Wieder was gelernt. Sowas steht nirgendwo so einfach und kompakt erklärt.

Manfred

hallo

augen reib

versteckt sich gleich hinterm rosa elefanten…

das kommt davon, wenn man zuviele dinge gleichzeitig machen will. hast recht, das „static“ habe ich mir eingebildet. werde auch schon alt…

lg
erwin