CodeGym /Kurse /Java Syntax /Referenzvariablen

Referenzvariablen

Java Syntax
Level 2 , Lektion 6
Verfügbar

„Hi, Amigo, ich bin‘s wieder, Ellie. Sorry, dass ich das immer wieder sage, aber es ist auf der Erde im 31. Jahrhundert so üblich. Ich möchte dir mehr Einzelheiten über Referenzvariablen und die Übergabe von Referenzvariablen an Funktionen (Methoden) geben.“

„Ich bin bereit.“

„Prima, dann hör gut zu. Referenzvariablen sind alle nicht primitiven Variablen. Solche Variablen enthalten nur eine Objektreferenz (eine Referenz auf ein Objekt).“

„Primitive Variablen enthalten Werte, während Referenzvariablen Referenzen auf Objekte oder Null speichern. Habe ich das richtig verstanden?“

„Absolut.“

„Was ist eine Referenz?“

„Die Beziehung zwischen einem Objekt und einer Objektreferenz ist wie die Beziehung zwischen einer Person und ihrer Telefonnummer. Die Telefonnummer ist nicht die Person, aber sie kann verwendet werden, um die Person anzurufen, nach Informationen zu fragen, sie zu verwalten oder Anweisungen zu geben. Eine Referenz wird auch für die Arbeit mit Objekten verwendet. Alle Objekte interagieren miteinander über Referenzen.“

„Als ob sie am Telefon miteinander reden würden?“

„Genau. Wenn eine primitive Variable zugewiesen wird, wird der Wert kopiert. Wenn eine Referenz zugewiesen wird, wird nur die Adresse des Objekts (die Telefonnummer) kopiert. Das Objekt selbst wird nicht kopiert.

„Okay, das hab ich verstanden.“

„Eine Referenz bietet dir noch einen weiteren Vorteil: Du kannst eine Objektreferenz an eine beliebige Methode übergeben, und diese Methode kann die Referenz verwenden, um das Objekt zu modifizieren (zu ändern), indem sie seine Methoden aufruft und auf Daten innerhalb des Objekts zugreift.“

Beispiel 1
Die Werte m und n ändern sich hier nicht.
public class References
{
  public static void main (String[] args)
  {
    int m = 5;
    int n = 6;

    System.out.println("M=" + m + " N=" + n);
    swap(m, n);
    System.out.println("M=" + m + " N=" + n);
  }

  private static void swap(int a, int b)
  {
    int c = a;
    a = b;
    b = c;
  }
}
Und hier ist der Grund.
Dieser Code ist analog zum Code links
public class References
{
  public static void main (String[] args)
  {
    int m = 5;
    int n = 6;

    System.out.println("M=" + m + " N=" + n);
    int a = m, b = n;

    int c = a;
    a = b;
    b = c;

    System.out.println("M=" + m + " N=" + n);
  }
}

„Nur die Werte 5 (m) und 6 (n) sind den Variablen a und b zugewiesen; a und b wissen nichts über m und n (und beeinflussen sie in keiner Weise).“

„Um ehrlich zu sein, merke ich gerade, dass ich nichts verstanden habe. Hast du noch mehr Beispiele?“

„Mit einer Objektreferenz hätten wir folgendes tun können:“

Beispiel 2
In diesem Code ändern sich die Daten der Objekte
public class Primitives
{
  public static void main(String[] args)
  {
    Student jen = new Student();
    jen.name = "Jen";
    jen.age = 21;

    Student beth = new Student();
    beth.name = "Beth";
    beth.age = 15;

    System.out.println("Jen is " + jen.age);
    System.out.println("Beth is " + beth.age);

    ageSwap(jen, beth);

    System.out.println("Jen is " + jen.age);
    System.out.println("Beth is " + beth.age);
  }

  private static void ageSwap(Student a,
                                    Student b)
  {
    int c = a.age;
    a.age = b.age;
    b.age = c;
  }

  static class Student
  {
    String name;
    int age;
  }
}
Und hier ist der Grund.
Dieser Code ist analog zum Code links
public class Primitives
{
  public static void main(String[] args)
  {
    Student jen = new Student();
    jen.name = "Jen";
    jen.age = 21;

    Student beth = new Student();
    beth.name = "Beth";
    beth.age = 15;

    System.out.println("Jen is " + jen.age);
    System.out.println("Beth is " + beth.age);

    Student a = jen, b = beth;

    int c = a.age;
    a.age = b.age;
    b.age = c;

    System.out.println("Jen is " + jen.age);
    System.out.println("Beth is " + beth.age);
  }





  static class Student
  {
    String name;
    int age;
  }
}

„Referenzen auf jen bzw. beth werden den Variablen a und b zugewiesen; a und b ändern die Werte innerhalb der Objekte jen und beth.“

„Und man kann Klassen innerhalb anderer Klassen deklarieren, richtig? Cool!“

„Aber alles andere verstehe ich immer noch nicht richtig.“

„Kommt Zeit, kommt Rat.“

Kommentare (16)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Andrej Level 2, Wunsiedel, Germany
23 Februar 2023
too much information - System wird heruntergefahren...
Hariboto Level 7, Dresden, Germany
3 Februar 2023
Ui, da muss man dann aber beim programmieren immer mitdenken: Wird gerade kopiert oder referenziert? Das wird ja spannend, wie oft man sich da aus Versehen vertut.
Marcellus Level 6, Denmark
21 Dezember 2022
ich drücke Nächste Lektion freischalten mit der Hoffnung, dass ich es bald verstehen werde ;D
Pelikan Level 3, Schönebeck, Germany
1 Juni 2022
Ich bin eigentlich froh, dass der Kurst so scheibchenweise aufgebaut ist und nicht versuchen alles gleichzeitig zu erklären.
Minove Level 6, Germany
2 November 2021
int c = a; a = b; b = c; Bedeutet doch das am ende c = b und c = a also ist beides c aber es soll doch vertauscht werden verstehe ich nicht
25 November 2021
Das auf der rechten Seite des Gleichheitszeichens wird immer zuerst auf das linke "gesetzt". Also int c = a heißt, dass der Wert von a in die Zwischenvariable c gespeichert wird. Dann wird der Wert von b in a gespeichert und damit überschrieben, was auch immer in a vorher stand (a = b). Und nun wird der neue Wert von c, den wir ja ganz am Anfang den Wert von a gegeben haben, in b gespeichert.
Anonymous #11051542 Level 5, Köln, Germany
12 August 2022
da hab ich mal ne super analogie in nem video gesehen mit vollen gläsern. du hast die vollen gläser a und b und möchtest deren inhalte tauschen. also nimmst du ein leeres glas c in das du a hineingießt dann gießt du glas b in glas a und dann den inhalt von glas c (der ja eig der ursprüngliche inhalt von glas a ist) in glas b :)
Minove Level 6, Germany
1 November 2021
Beim lesen dachte ich mir nur: Super, das wid spät erklärt, auch was eine Referenz ist. All das hab ich schon vor ein paar lektionen im Netz nach gelesen.
finnmohrmann Level 3, Germany, Germany
3 November 2021
hatte ich mich auch schon die letzten Übungen gefragt... das ist aber immer so dass man Dinge erst nach einigen Lektionen wirklich versteht.
Daniel Ritter Level 17, Augsburg, Deutschland
31 März 2021
Innere Klassen werden hier so beiläufig erwähnt, wurden aber tatsächlich schon in diversen Aufgaben verwendet. Kann für blutige Anfänger sehr verwirrend sein. Das sollte evtl bereits in dem Kapitel besprochen werden, in dem es generell um Klassen geht bzw um den Aufbau eines Programms (Java Syntax Level 1, Lesson 1)... Dort wird bisher nämlich der Anschein erweckt, dass jede Klasse immer in einer eigenen Datei stehen muss.
27 Dezember 2020
Ändern sich im 2. Beispiel recht eigentlich auch die Daten der Objekte?
Leon Level 22
19 März 2021
Ja, steht im vorletzten Satz von Ellie.
Ansgar Fieberg Level 4, Nuremberg, Germany
14 April 2020
okay das hab ich soweit verstanden aber die methode altervertauschen muss nichts an die main methode zurückgeben?
25 April 2020
Hi, nein muss sie definitiv nicht. Da es sich um eine Referenz handelt, zeigt diese ja direkt auf die Variablen. Sobald Du die Referenz änderst, werden die Werte der Variablen innerhalb der Objekte geändert.
Fabi Dev Level 2, Vienna, Austria
11 April 2020
Echt cool:)