Referenzvariable wird verändert

Cruentus

Mitglied
Hallo allerseits,

hab so ein kleines Verstädnis-Problem, was Referenzvariablen angeht. Ich habe u.a. folgenden Quelltext:
Java:
public class Spielroboter
{
    private Hauptfenster _hauptfenster;
    
    private double[] koord1 = {50,0,0};

    /**
     * Konstruktor für Objekte der Klasse Spielroboter
     * 
     * @param fenster Übergabe der Referenz auf das Hauptfenster, um Bauteile einfügen zu können
     */
    public Spielroboter(Hauptfenster fenster)
    {
        _hauptfenster = fenster;
        bauteilKonstruktion();
    }
    
    /**
     * Auslagerung der Konstruktion des eigentlichen Roboters
     */
    private void bauteilKonstruktion()
    {
        _hauptfenster.bauteilPlus(koord1, "xy-radial", 0, 8);        
    }

Das Programm startet mit Erzeugung eines Exemplar der selbstgeschriebenen Klasse Hauptfenster, welches ein Exemplar der Klasse Spielroboter erzeugt. Hauptfenster hat eine Methode bauteilPlus, in der auch die als formale Parameter übergebenen Werte verändert werden.
Ich hatte das jetzt so verstanden, dass wenn ich in bauteilKonstruktion() koord1 als Referenzvariable an bauteilPlus() übergebe, die eigentliche Variable koord1 nicht verändert wird, wenn bauteilPlus() die übergebenen Zahlenwerte ändert. Genau das passiert aber: Wenn bauteilPlus() die übergebenen Zahlen ändert, ändern sie sich auch in koord1 in Spielroboter!?
Das irritiert mich gelinde gesagt...
 
N

nillehammer

Gast
Ich hatte das jetzt so verstanden, dass wenn ich in bauteilKonstruktion() koord1 als Referenzvariable an bauteilPlus() übergebe, die eigentliche Variable koord1 nicht verändert wird,
Das stimmt soweit, die Referenz, die in koord1 gespeichert ist, wird nicht verändert. Aaaaber wenn das Objekt ansich einen inneren Zustand hat, der geändert werden kann, dann ist diese Änderung auch nach außen sichtbar. Wenn du also einen Array übergibst und dort die Elemente änderst, ist das auch von außen sichtbar.
 

Cruentus

Mitglied
aber durch die Übergabe an bauteilPlus() wird koord1 ja quasi "kopiert"...und da bauteilPlus() nur mit dieser "Kopie" arbeitet, dürfte koord1 doch nie verändert werden, oder?
 

Michael...

Top Contributor
aber durch die Übergabe an bauteilPlus() wird koord1 ja quasi "kopiert"...
Es wird die Referenz auf das Array Objekt kopiert. Aber beide Referenzen verweisen immer noch auf das selbe Objekt. Wenn über eine Referenz Attribute des Objekts verändert werden, bekommt man das natürlich auch mit wenn man über die zweite Referenz auf (einund)dasselbe Objekt zugreift.
 

Cruentus

Mitglied
hmm...okay. Ich habe jetzt mal folgenden Beispielcode:
Java:
public class test
{
    // Instanzvariablen - ersetzen Sie das folgende Beispiel mit Ihren Variablen
    private Integer x;

    /**
     * Konstruktor für Objekte der Klasse test
     */
    public test()
    {
        // Instanzvariable initialisieren
        x = 17;
        aendereVar(x);
    }

    /**
     * Testprozedur
     */
    private void aendereVar(int zahl)
    {
        zahl = 0;
    }
    
}

x ist ja in diesem Fall auch nur eine Referenzvariable auf das Zahlobjekt "17". Wenn ich diese Referenz nun an die Prozedur übergebe und dort auch ändere, verweist x aber weiterhin auf "17" (sagt BlueJ).
Hab ich da jetzt einen Denkfehler oder kann man das einfach nicht mit einem ArrayObjekt verlgeichen?
 

timbeau

Gesperrter Benutzer
Ich bin mir nicht zu 100% sicher aber auch wenn das ein Integer ist, wird es wie ein int = primitiver Datentyp behandelt. Diese werden kopiert. Objekte aber nur die Referenz.
 

Michael...

Top Contributor
Mal abgesehen davon, dass Primitive anders behandelt werden.

In Java gibt es nur "Call by Value". Heißt beim Methodenaufruf wird der "Wert" der Variblen kopiert und an die Methode übergeben.
Bei Primitives wie int ist es eben z.B. der Wert 17. Bei Objektvariablen eben die Referenz aufs Objekt.
 
N

nillehammer

Gast
Das kann man in mehlei Hinsicht nicht mit dem ArrayObjekt vergleichen. Erstmal ist es bei Deinem Test unglücklich, dass deine Methode aendereVar ein primitives int als Parameter hat. Primitives werden nämlich nochmal anders behandelt als Objekte.

Gehen wir aber mal davon aus, dass es ein Integer-Objekt ist. Du hast zwei Referenzvariablen x und zahl. Beim Aufruf von aendereVar zeigen beide Referenzvariablen auf dasselbe Objekt (Referenz ist kopiert worden). Nach dieser Zeile
[JAVA=21]
zahl = 0;
[/code]
zeigt x weiterhin auf Dein Integer-17, während durch die Zuweisung zahl jetzt auf ein Integer-0 zeigt. Du hast also hier nichts am internen Zustand eines Objekts geändert (geht bei Integer übrigens auch garnicht), sondern Variablen verschiedene Instanzen zugewiesen.

P.S. Dieses ganze "Call-by-Value/Call-by-Reference" oder wie auch immer ist aber auch nicht so wichtig. Wenn Du etwas übergibst, dass einen internen Zustand hat, den man ändern kann und in einer Methode wird etwas geändert, so kann man es dem entspr. Objekt von überall aus ansehen.

Ein Array ist etwas mit einem internen Zustand (Elemente in einer gewissen Reihenfolge), wird der Verändert, sieht man es überall, wo man eine Referenz auf diesen Array hat. Wenn Du das nicht möchtest, must Du selbst Kopien anlegen. Java macht das nicht für Dich.
 
Zuletzt bearbeitet von einem Moderator:

Cruentus

Mitglied
Das scheint es zu sein...wenn ich aus dem Integer ein einzelliges Array-Objekt mache, enthält es nicht "17" sondern "0". Also muss ich wohl bei Array-Objekten in Zukunft besser aufpassen.
Aber ich danke euch für eure Hilfe, nun kann der Spaß weitergehen:toll:

edit:
Das kann man in mehlei Hinsicht nicht mit dem ArrayObjekt vergleichen. Erstmal ist es bei Deinem Test unglücklich, dass deine Methode aendereVar ein primitives int als Parameter hat. Primitives werden nämlich nochmal anders behandelt als Objekte.

Stimmt, das war so nicht beabsichtigt. Hatte das int doch noch kurzentschlossen in Integer geändert und dabei die Methode vergessen:oops:

Hab das jetzt einfach gelöst, indem ich an das Array ein .clone() rangehängt habe, funktioniert jetzt tadellos, danke nochmal!
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Referenzvariable vom Typ "Integer" definieren. (Klausuraufgabe) Java Basics - Anfänger-Themen 5
Aprendiendo Unterschied zwischen Referenzvariable und Instanzvariable. Java Basics - Anfänger-Themen 2
E Referenzvariable in anderer Klasse aufrufen Java Basics - Anfänger-Themen 3
E Klassen Referenzvariable in anderer Klasse aufrufen. Java Basics - Anfänger-Themen 1
P Referenzvariable nicht gefunden Java Basics - Anfänger-Themen 5
Arif Variablen Instanzvarible oder Referenzvariable Java Basics - Anfänger-Themen 2
F Methoden: Referenzvariable als Parameter Java Basics - Anfänger-Themen 4
R Variablen Möglich?: Cast einer Referenzvariable auf den Typ seines Objektes Java Basics - Anfänger-Themen 19
J Objekterzeugung im Konstruktor - Mehrfach gleiche Referenzvariable? Java Basics - Anfänger-Themen 4
M Aufbau der Klassenbibliothek und Referenzvariable Java Basics - Anfänger-Themen 5
J Unterschied Instanzattribut und Referenzvariable Java Basics - Anfänger-Themen 4
K Referenzvariable vorab deklarieren Java Basics - Anfänger-Themen 6
K Warum wird mir auf der Konsole des Servers nicht "xxxx" angezeigt (Server/Client) Java Basics - Anfänger-Themen 4
K Warum wird hier nur etwas in eine txt Datei geschrieben und nicht in alle drei (InputStream/OutputStream/Reader/Writer) Java Basics - Anfänger-Themen 1
I Exception wird gefangen, aber trotzdem in Error Log? Java Basics - Anfänger-Themen 10
H JDK installieren jdk-21 wird nicht erkannt Java Basics - Anfänger-Themen 13
T if-else Bedingung wird ignoriert Java Basics - Anfänger-Themen 4
K Warum wird mir "Empfangen vom Client:" nicht sofort ausgegeben(Server/Client) Java Basics - Anfänger-Themen 3
P Webseite vom Smartmeter wird nur unleserlich angezeigt Java Basics - Anfänger-Themen 7
A Warum wird mein jdk nicht gefunden? Java Basics - Anfänger-Themen 3
J jar Befehl wird nicht erkannt Java Basics - Anfänger-Themen 7
M Anonyme Klassen - Warum wird in der Konsole nichts ausgegeben? Java Basics - Anfänger-Themen 1
T catch(InputMismatchException) wird nicht ausgefürt/erkannt Java Basics - Anfänger-Themen 12
berserkerdq2 Intelij, wie kann ich einstellen, dass die aktuelle Klasse ausgeführt wird, wenn ich aufs Startsymbol drücke, gibts da eine Tastenkombination? Java Basics - Anfänger-Themen 11
M Verständnisfrage: Warum wird die Datei ohne Inhalt übertragen Java Basics - Anfänger-Themen 3
Ostkreuz Wieso wird die Methode nochmal aufgerufen? Java Basics - Anfänger-Themen 5
Oneixee5 Maven Plugin wird 2 mal ausgeführt Java Basics - Anfänger-Themen 10
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
D Interface Methode wird ungewollt in der Subklasse überschrieben Java Basics - Anfänger-Themen 5
C Was tun wenn .class erwartet wird ? Java Basics - Anfänger-Themen 6
T Meine Klasse wird nicht gefunden Java Basics - Anfänger-Themen 1
T Wie kann man es machen das ein Objekt nicht übermalt wird Java Basics - Anfänger-Themen 2
K Warum wird mir hier nach dem ersten Durchlauf zwei mal "welchen Datentyp wollen sie übergeben?" ausgegeben ? Java Basics - Anfänger-Themen 1
MiMa Ungültiges Datum wird nicht erkannt ?? Java Basics - Anfänger-Themen 6
schemil053 Multithread - Input verrutscht während etwas ausgegeben wird Java Basics - Anfänger-Themen 6
K REGEX - Rechnungsbetrag wird nicht richtig ausgelesen. Java Basics - Anfänger-Themen 3
_user_q Timer - ScheduledExecutorService wird schon vorher beendet Java Basics - Anfänger-Themen 5
X Erste Schritte Scanner eingabe wird übersprungen Java Basics - Anfänger-Themen 4
H Compiler-Fehler Klasse in einem Package wird nicht gefunden bzw. akzeptiert Java Basics - Anfänger-Themen 12
L Switch-Case Multiplikation wird nicht ausgegeben Java Basics - Anfänger-Themen 1
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 0
J In der Ausgabe wird ohne Eingabe in den else Block gesprungen. Java Basics - Anfänger-Themen 5
M Text wird in der Console nicht ausgegeben. Java Basics - Anfänger-Themen 11
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Zweidimensionales Array [][] wird untereinander ausgegeben Java Basics - Anfänger-Themen 14
sserio Math. Befehl wird rot markiert Java Basics - Anfänger-Themen 5
M Rechteck wird nicht angezeigt Java Basics - Anfänger-Themen 3
B Bungeecord | ProxiedPlayer wird nicht in ArrayList hinzugefügt Java Basics - Anfänger-Themen 1
U Methode wird genutzt, ohne dass ich die aufrufe? Java Basics - Anfänger-Themen 4
S Methoden Return Rückgabewert wird nicht übergeben Java Basics - Anfänger-Themen 8
M Mein quellcode wird nicht in der Konsole ausgegeben Java Basics - Anfänger-Themen 3
I Code wird nicht ausgeführt Java Basics - Anfänger-Themen 2
M wird der Konstruktor nicht als 1. ausgeführt? Java Basics - Anfänger-Themen 13
G Main Methode wird beim ersten Aufruf nicht richtig ausgeführt Java Basics - Anfänger-Themen 1
K Präzedenregeln in Java sagen, dass +expr und -expr vor + von Addition und - von Addition stehen, warum wird dann z. B. a+b als eine Addition ausgeführ Java Basics - Anfänger-Themen 7
M Was wird hier genau getestet? Java Basics - Anfänger-Themen 9
M Wie schreibe ich eine if-Verzweigung um, so dass ein Bedingungsoperator benutzt wird? Java Basics - Anfänger-Themen 9
I Programm erkennt nicht an das Array zurückgegeben wird trotz Initialisierung *einfach* Java Basics - Anfänger-Themen 9
K Jlabel mit itemlistevent Text gegeben, wird nicht angezeigt Java Basics - Anfänger-Themen 5
P Mein Programm wird zwar erfolgreich Compiliert, öffnet sich aber nicht Java Basics - Anfänger-Themen 6
M Referenzen zuweisen und wird gleichzeitig ausgeführt Java Basics - Anfänger-Themen 6
O System.out.println wird nicht ausgegeben? Java Basics - Anfänger-Themen 11
Zrebna Umgebungsvariable Wieso wird meine verwendete JDK-Version in der Prompt nicht erkannt? Java Basics - Anfänger-Themen 6
el_pato DialogFenster wird nicht in Schleife geöffnet? Java Basics - Anfänger-Themen 30
J if-Schleife innerhalb einer if-Schleife wird in der Konsole nicht gelesen Java Basics - Anfänger-Themen 4
P Apache Derby wird in Eclipse trotz Anbindung nicht gefunden Java Basics - Anfänger-Themen 6
H Array wird als Rückgabewert nicht akzeptiert? Java Basics - Anfänger-Themen 2
Poppigescorn scan.nextInt() wiederholen bis eine Zahl eingeben wird Java Basics - Anfänger-Themen 7
F Session wird mehrfach erzeugt Java Basics - Anfänger-Themen 11
F Initialisieren eines Web-Mp3 Players in Tabs durch "booleans" erst wenn Tab geöffnet wird ...? Java Basics - Anfänger-Themen 1
fuerteb Compiler-Fehler Methode wird nicht bzw. als Fehler erkannt Java Basics - Anfänger-Themen 4
L JScrollPane wird nicht angezeigt Java Basics - Anfänger-Themen 10
D Hilfe beim Erzeugen eines Arrays NullPointerException wird ausgelöst Java Basics - Anfänger-Themen 11
J JTable Titel wird nicht angezeigt Java Basics - Anfänger-Themen 6
krgewb Long wird gerundet Java Basics - Anfänger-Themen 2
Zwanglos Warum wird nur die erste Zeile im while Block ausgeführt? Java Basics - Anfänger-Themen 8
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
H GridPane wird nicht angezeigt Java Basics - Anfänger-Themen 0
M Was habe ich hier falsch, dass wenn ich z.B.: 11 eingebe mir false zurück gegeben wird? Java Basics - Anfänger-Themen 2
M Java Spiel wie Wer wird Millionär Java Basics - Anfänger-Themen 1
H Endkapital wird nicht korrekt ausgegeben. Java Basics - Anfänger-Themen 5
C Methodenrückgabe wird in der main nicht berücksichtigt Java Basics - Anfänger-Themen 2
X compareTo Methode wird ignoriert Java Basics - Anfänger-Themen 7
kodela Hauptklasse wird nicht gefunden Java Basics - Anfänger-Themen 3
H Befehl wird nicht ausgeführt - System.out.println Java Basics - Anfänger-Themen 3
I Input/Output Code wird doppelt ausgeführt Java Basics - Anfänger-Themen 3
P Bedingung in Schleife wird nicht ausgeführt Java Basics - Anfänger-Themen 5
P Variablen HttpResponse.getBody() wird automatisch org.json Object und kann nicht zu json.simple Object gecastet werden? Java Basics - Anfänger-Themen 7
N Selection Algorithmus: Methode wird nicht erkannt (BlueJ) Java Basics - Anfänger-Themen 3
N package wird doppelt im exporer angezeigt Java Basics - Anfänger-Themen 2
N Bedinugng If-Abfrage wird nie erfüllt Java Basics - Anfänger-Themen 4
M Else wird nicht ausgeführt. Java Basics - Anfänger-Themen 5
H Wie wird ein String intern gespeichert? Java Basics - Anfänger-Themen 10
A char array wird überschrieben Java Basics - Anfänger-Themen 6
E Methoden Action Event wird nicht vollständig ausgeführt Java Basics - Anfänger-Themen 3
L Iterieren durch eine ArrayList. Integer Array wird übergeben Java Basics - Anfänger-Themen 17
S setContentView(R.Layout.XXX) wird Rot angezeigt Java Basics - Anfänger-Themen 0
C Beispiel-Code mit Pair wird nicht compiliert. Java Basics - Anfänger-Themen 8
S Integer Wert wird nicht übernommen Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben