– Cześć, Amigo, to znowu ja, Baśka. Przepraszam, że w kółko to powtarzam, ale taki jest zwyczaj na Ziemi w XXXI wieku. Chcę przekazać Ci więcej informacji na temat zmiennych referencyjnych i przekazywania zmiennych referencyjnych do funkcji (metod).

– Jestem gotowy.

– Świetnie, zatem słuchaj. Zmienne referencyjne to wszystkie zmienne, które nie są zmiennymi prostymi. Takie zmienne przechowują tylko referencję obiektu (odwołanie do obiektu).

– Zmienne proste przechowują wartości, podczas gdy zmienne referencyjne przechowują referencje do obiektów lub null. Mam rację?

– Dokładnie.

– Co to jest referencja?

– Relacja pomiędzy obiektem i referencją obiektu jest jak relacja pomiędzy osobą i jej numerem telefonu. Numer telefonu nie jest osobą, ale można użyć go, aby zadzwonić do danej osoby, poprosić o informacje, kontrolować ją lub wydawać jej polecenia. Referencja służy właśnie do pracy z obiektami. Wszystkie obiekty oddziałują na inne za pomocą referencji.

– Jakby rozmawiały ze sobą przez telefon?

– Dokładnie. Gdy wykonujemy przypisanie zmiennej prostej, wartość jest kopiowana. Jeżeli przypisujemy referencję, kopiowany jest adres obiektu (numer telefonu). Sam obiekt nie jest kopiowany.

– OK, mam to.

– Referencja daje jeszcze jedną korzyść: możesz przekazać referencję obiektu do dowolnej metody i będzie ona mogła użyć tej referencji, aby zmodyfikować (zmienić) obiekt poprzez wywołanie jego metod i dostęp do danych wewnątrz obiektu.

Przykład 1
Tutaj wartości m i n nie zmieniają się.
public class Referencje
{
  public static void main (String[] args)
  {
    int m = 5;
    int n = 6;

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

  private static void zamiana(int a, int b)
  {
    int c = a;
    a = b;
    b = c;
  }
}
A oto, dlaczego tak jest.
Ten kod jest analogiczny do kodu po lewej stronie.
public class Referencje
{
  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);
  }
}

– Do zmiennych a i b przypisywane są tylko wartości, odpowiednio 5 (m) i 6 (n); a i b nie wiedzą nic o zmiennych m i n (i nie wpływają na nie w żaden sposób).

– Prawdę mówiąc, teraz rozumiem, że nic nie rozumiem. Czy możesz podać mi jeszcze kilka przykładów?

– Używając referencji obiektu, moglibyśmy zrobić tak:

Przykład 2
W tym kodzie dane obiektów zmieniają się.
public class Prymitywy
{
  public static void main(String[] args)
  {
    Student jola = new Student();
    jola.imie = "Jola";
    jola.wiek = 21;

    Student ela = new Student();
    ela.imie = "Ela";
    ela.wiek = 15;

    System.out.println("Jola ma " + jola.wiek);
    System.out.println("Ela ma " + ela.wiek);

    zamianaWieku(jola, ela);

    System.out.println("Jola ma " + jola.wiek);
    System.out.println("Ela ma " + ela.wiek);
  }

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

  static class Student
  {
    String imie;
    int wiek;
  }
}
A oto, dlaczego tak jest.
Ten kod jest analogiczny do kodu po lewej stronie.
public class Prymitywy
{
  public static void main(String[] args)
  {
    Student jola = new Student();
    jola.imie = "Jola";
    jola.wiek = 21;

    Student ela = new Student();
    ela.imie = "Ela";
    ela.wiek = 15;

    System.out.println("Jola ma " + jola.wiek);
    System.out.println("Ela ma " + ela.wiek);

    Student a = jola, b = ela;

    int c = a.wiek;
    a.wiek = b.wiek;
    b.wiek = c;

    System.out.println("Jola ma " + jola.wiek);
    System.out.println("Ela ma " + ela.wiek);
  }





  static class Student
  {
    String imie;
    int wiek;
  }
}

– Referencje do jola i ela są przypisywane odpowiednio do zmiennych a i b; a i b zmieniają wartości w obiektach jola i ela.

– I można deklarować klasy wewnątrz innych klas, tak? Super!

– Ale nadal nie do końca rozumiem całą resztę.

– Wszystko w swoim czasie.