CodeGym /Kursy Java /Składnia Java /Zmienne referencyjne

Zmienne referencyjne

Składnia Java
Poziom 2 , Lekcja 6
Dostępny

– 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.

Komentarze (10)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Radek Poziom 2, Poland, Poland
10 marca 2023
mnie ciekawi po co takie zamieszanie z tym int c = a.wiek; a.wiek = b.wiek; b.wiek = c; wychodzi na to ze kazdy wiek jest ten sam wiec po co pisac to 3x ?
Anonymous #11274698 Poziom 8, Gorzow Wielkopolski, Poland
13 marca 2023
To chyba po to żeby pokazać Ci że jest możliwość napisania zmiennej która jest równa innej zmiennej
Przemo Poziom 17, Legnica, Poland
12 grudnia 2023
Jak niby ten sam? Po to tworzysz trzecią zmienną "c" która na chwilę będzie przechowywać wartość zmiennej "a". Bo później wartość w "a" już jest zastępowana wartością ze zmiennej "b" i jedyne miejsce gdzie istnieje jeszcze wartość starego "a" jest w "c". A później "b" zamienia sobie swoją wartość na wartość pierwotnego "a". I tak oto zamieniły się miejscami, zmienna "c" przestaje być potrzebna.
Tomasz Poziom 16
12 listopada 2022
Rozumiem, ale nie do końca. W analogicznym przykładzie do drugiego, w ktorym zamiana działa, jest napisane ( student a = jola, student b = ela; ) to rozumiem ze jola jest podstawiana pod a , a ela pod b. Potem sie zamianiają ze sobą. Ale w tym pierwszym przykladzie, to nie wiem, gdzie jest podane, że jola jest a, ela jest b. Wie ktoś?
Kasia L Poziom 3, Poland, Poland
4 grudnia 2022
linia -> zamianaWieku(jola, ela); -> czyli wywołujemy metoda zamianaWieku i przekazujemy dwa parametry czyli jola i ela linia -> private static void zamianaWieku(Student a, Student b) -> metoda przyjmuje dwa parametry pierwszym jest student a, drugim student b czyli według tego zapisu jako student a zostaje wprowadzona jola, a jako studenta b ela
MordecaiXVIII Poziom 3, Łódź, Poland
27 stycznia 2022
W ogóle tego nie czaje. te dwa przykłady praktycznie w ogóle się dla mnie nie różnią poza tą jedna linia kodu "private static void zamianaWieku(Student a, Student b)", która nie wiem co wnosi i zmienia.
Jarosław K Poziom 9, Poland
27 stycznia 2022
Przeczytaj kilka razy "Referencje do jola i ela są przypisywane odpowiednio do zmiennych a i b; a i b zmieniają wartości w obiektach jola i ela." Potem podstaw wartości do zmiennych zaczynając od int c .
Luca Poziom 2, Warsaw, Poland
23 października 2022
z tego co zauważyłem to kod trzeba czytać trochę od końca. czyli tworzymy clase Student. W tej klasie mamy zmienne String (czyli literki) imie ( jakies imie naszego studenta) oraz zmienną int(cyferki) wiek naszego studenta. i teraz idziemy na poczatek naszego kodu i tworzymy nowego Studenta, ktoremu dajemy imie oraz wiek. i dalsza czesc kodu...
Karol Wijas Poziom 12, Zawada, Poland
25 listopada 2020
Po przeanalizowaniu przykładów fajnie i prosto można zrozumieć o co chodzi :) :D
YooRec Poziom 2, Lodz, Poland
28 grudnia 2021
Nic nie zrozumiałem... :/