Poruszone zagadnienia
- Zmienna prymitywna
- Zmianna referencyjna
- Referencja
- Sterta
- Zmienne w tablicy
Teoria
Witam ponownie przyszły programisto. Dziś stosunkowo łatwa, ale istotna lekcja. Porozmawiamy o zmiennych.
Zmienne
Czym są zmienne? To nic innego jak kontenery danych, które przechowują wartości/informacje w formie bitów.
Zmienne dzilimy na:
- Proste (prymitywne) - przechowują wartości:
- liczb całkowitych:
- byte (przedział od -128 do 127) // 1 bajt
- short (przedział od -32 768 do 32 767) // 2 bajty
- int (przedział od -2 147 483 648 do 2 147 483 647) // 4 bajty
- long (przedział od -2^63 do 2^63-1), przyrostek L lub l // 8 bajtów
- liczb zmiennoprzeciwnowych
- float ( do 7 liczb po przecinku i przyrostek F lub f) // 4 bajty
- double (> 7 liczbami po przecinku i przyrostek D lub d) // 8 bajtów
- char - pojedyńcze znaki
- np. (’@’ lub ‘s’ lub ‘2’)
- boolean - wartości logiczne
- true / false
Zmienne referencyjne (obiektowe) - przechowują referencję
Ale referencję czego? Co to oznacza? A no referencję Obiektów. Bo Java, jak pewnie dobrze pamiętasz jest językiem obiektowym!
W dużym skrócie, zmienne referencyjne przechowują referencję Obiektów, czyli ich adres.
Co to w praktyce oznacza? Przede wszystkim to, że zmianne referencyjne nie przechowują Obiektów. To bardzo istotna informacja, ponieważ są zmienne te są jedynie specyficznym narzędziem umożliwiającym dostęp do tych Obiektów. Taka przepustka, która daje Ci prawo wejścia przez wrota prowadzące do danego Obiektu. Tyle na ten moment starczy. Reszte dopowiemy sobie później.
Zmienne proste reprezentują zatem konkretne wartości, a zmienne referencyjne sposób, w jaki można dostać się do Obiektów.
Tworzenie zmiennych
Każda zmienna powinna mieć typ, nazwę oraz przypisaną wartość.
- Nazwa zmiennej powinna zaczynać się od litery, podkreślenia, tzw. “podłogi” (_) lub znaku dolara ($).
- Nie może zaczynać się od liczby, ani tzn. keywordów używanych w kodzie Javy (np. char, static)
A jak oficjalnie tworzyć zmienne? Poprzez 2 etapy:
- Deklaracja - tworzenie zmiennej, nadawanie jej typu oraz nazwy.
- Inicjalizacja - przypisanie wartości do tej zmiennej (odbywa się poprzez znak równości)
nazwaTypu nazwaZmiennej = wartość; // deklaracja oraz inicjalizacja
Zmienne proste:
float cenaChleba = 3.99f; char literaAlfabetu = 'A'; boolean czyUmieJave = true;
Zmienne referencyjne:
Auta mercedes = new Auta(); Pies labrador = new Pies(); String imie = "Janek"; // String też jest typem obiektowym/referencyjnym!
Jeśli chodzi o zmienne referencyjne, to typ jej określamy Klasą Obiektu, do którego dana zmienna się odnosi. Inaczej mówiąc:
Auta mercedes = new Auta(); //typ zmiennej referencyjnej = Klasa Obiektu
Tworzenie obiektów
Auta mercedes = new Auta(); // posłużmy się tym przykładem, aby przedstawić jak przebiega // 1 3 2 proces tworzenia obiektów
Etap 1. Deklaracja
Prosimy wirtualną maszynę Javy (JVM), aby zarezerowała dla nas miejsce w pamieci (na tzw. Stosie) dla zmiennej referencyjnej typu Auta i nazwie mercedes.
Etap 2. Tworzenie Obiektu
Wnioskujemy u JVM o rezerwacje miejsce w Stercie dla nowego Obiektu typu Auta
Etap 3. Inicjalizacja (przypisanie wartości)
Przypisujemy nowy Obiekt do zmiennej referencyjnej mercedes
Przypisywanie zmiennej do innej zmiennej
Java jest językiem silnie typowanym. Oznacza to zmienne posiadają określony typ danych, który nie może zostać zmieniony w czasie działania programu. Składnia oraz zgodność typów jest priorytetem, aby kod mógł zostać wykonany. Jest to metoda na eliminacje potencjalnych błędów. Przykładowo, niemożliwe jest przypisanie:
a) zmiennej prostej o większym przedziale do zmiennej o mniejszym, np. long do int
b) zmiennej zmiennoprzeciwnkowej do zmiennej całkowitej, np. float do int (chyba, że poinformujesz kompliator Javy, że wiesz co robisz i stracisz dokładność liczby)
c) zmiennych referencyjnych do zmiennych prostych, np. Auta do char
d) zminnej referencyjnych jednego typu, do zmiennych referencyjnych innego typu, np. Auta do Motocykle
Silne typowanie, hmm… Jedni chwalą, inni są przeciwnikami. Zawsze są plusy i minusy. Python, np. jest dynamicznie typowany, co oznacza, że w trakcie wykonywania kodu, typ jest automatycznie przydzielny do zmiennej, co przyśpiesza proces tworzenia kodu. Anyway… Lecimy dalej!
Operacje na zmiennych
Jak już wspomniałem, zmienna referencyjna odwołuje się do Obiektu. Jest to pewnego rodzaju dostęp do zmiennych instancji oraz metod, które znajdują się w Klasie, do której dana zmianna się odwołuje (Klasy tego Obiektu). Rzućmy okiem na taki przykład:
class Auta{ String marka; // to klasa zawierające 3 zmienne instancji bez przypisanych wartości int cena; String kolor; void odpalSiniki(){ System.out.println("Brum, brum!"); } class salonSamochodowy { public static void main(String [] args){ Auta fura = new Auta(); // tworzymy nowy obiekt i przypisujemy jego adres // do zmiennej referencyjnej typu "Auta" o nazwie "fura" fura.marka = "BMW"; //uzyskujemy dostęp do zmiennych instancji obiektu typu Auta fura.cena = 300000; //dostęp ten zyskujemy dzięki operatorowi kropki "." fura.kolor = "czarny" //następnie przypisujemy do zmiennych konkretne wartości fura.odpalSilnik(); //wywołujemy metodę odpalsinik() na Obiekcie, którego adres //przypisaliśmy do zmiennej "fura" // auto wydaje dźwięk silnika } } }
Myślę, że ten przykład dobrze obrazuje temat.
Sterta
Niezwykle istotny temat. Z pewnością jest to materiał na osobną rozmowę. Jednak na tem moment ważne abyś wiedział, że Sterta to miejsce w pamięci, w którym ulokowane są Obiekty. Ciekawostką jest fakt, że Obiekty te posiadają swoje tzw. Życie Obiektu, nad którym warto zastanowić się nieco dłużej.
Jednym z możliwych scenariuszy jest sytuacja, w której Obiekt zostaje utworzony, a następnie wykorzystany przez program. Innym przypadkiem może być sytuacja, w której Obiekt jest przechowywany w pamięci, ale nie jest już używany przez program. Warto również zwrócić uwagę na sytuację, w której Obiekt zostaje usunięty z pamięci, np. w momencie zakończenia pracy programu.
Jak widać, temat ten jest obszerny i warto poświęcić mu więcej uwagi. Skupimy się na kilku przykładach, aby uchwycić sedno Sterty:
Przypadek 1.
// Tworzymy 2 zmienne referencyjne Auto auto1 = new Auto(); // zmienna auto1 odnosi się jedynie do Obiektu1 Auto auto2 = new Auto(); // zmienna auto2 odnosi się jedynie do Obiektu2 /* Mamy: 2 zmienne i 2 obiekty auto1 -> Obiekt1 auto2 -> Obiekt2 Oznacza to że każda z 2 zmiannych posiada adres do 2 niezależnych Obiektów */
Przypadek 2.
// Tworzymy 3 zmienne referencyjne Auto auto1 = new Auto(); // zmienna auto1 odnosi się jedynie do Obiektu1 Auto auto2 = new Auto(); // zmienna auto2 odnosi się jedynie do Obiektu2 Auto auto3 = auto2 // przypisujemy auto3 do auto2 /* Mamy: 3 zmienne i 2 obiekty auto1 -> Obiekt1 auto2 -> Obiekt2 auto3 -> Obiekt2 Zmienna auto3 kopiuje adres do Obiektu2 (do którego odnosi się również auto2) */
Przypadek 3.
// Tworzymy 2 zmienne referencyjne Auto auto1 = new Auto(); // zmienna auto1 odnosi się jedynie do Obiektu1 Auto auto2 = new Auto(); // zmienna auto2 odnosi się jedynie do Obiektu2 auto2 = auto1; // zmienna auto2 kopiuje adres do Obiektu1 (do którego odnosi się auto1) /* Mamy: 2 zmienne i 1 obiekt auto1 -> Obiekt1 auto2 -> Obiekt1 Oznacza to, że adres do Obiekt2 nie jest przypisany do żadnej zmiennej */
Przypadek 4.
// Tworzymy 2 zmienne referencyjne Auto auto1 = new Auto(); // zmienna auto1 odnosi się jedynie do Obiektu1 Auto auto2 = null; // zmienna auto2 NIE ODNOSI się do żadnego Obiektu /* Mamy: 2 zmienne i 1 obiekt auto1 -> Obiekt1 auto2 = null Zmianna auto2 jest "pusta" (nie odwołuje się do żadnego Obiektu) Adres Obiektu2 nie jest przypisany do żadnej zmiennej */
Zmienne w tablicy
Tablica jest strukturą danych, która przechowuje elementy tego samego typu w sekwencyjny sposób. Każdy element w tablicy jest zatem zmienną. Zdrowy rozsądek podpowada, że tablica przechowująca, np. zmienne typu int, sama powinna być zdefiniowana jako tablica typu prostego. Otóż wyobraź sobie, że nie! 😀
Tablica sama w sobie jest Obiektem. Może przechowywać zmienne typu prostego, jednak sama nie może być zdefiniowana jako tablica typu prostego. Niezależnie od tego, czy zawiera zmienne typu prostego, czy zmienne referencyjne - zawsze będzie Obiektem.
Temat tablic i struktur danych w Javie pojawi się oczywiście w przyszłości, w osobnym wpisie.
Śledź mnie na LinkedIn
Newsletter
Jeśli masz jakieś sugestie lub pytania, proszę napisz do mnie wiadomość: kuba@javampokaze.pl