– Profesorowi ciężko jest porzucić swą rutynę. Starzy nauczyciele, którzy lubią wykładać, raczej tego nie zmieniają. Wszystko, o czym on opowiada, znajdziesz w książkach. Przecież nie nauczysz się pływać, słuchając wykładów o pływaniu. Wykłady mogą być przydatne, kiedy jesteś już zaznajomiony z tematem i wiesz prawie tak dużo, jak Profesor.
– A jednak lekcje bywają przydatne.
– Jasne. To znaczy, taką mamy nadzieję. Najlepiej poznać daną dziedzinę z wielu stron, bo wtedy zbliżasz się do prawdy. A kiedy znasz tylko jeden punkt widzenia, możesz jedynie w niego uwierzyć albo nie. OK, wróćmy do naszej lekcji.
– Spójrzmy na obrazek, który pokazałem Ci wcześniej.
┏
┃public class Zmienne
┃┏
┃┃{
┃┃ private static String TEKST = "Koniec.";
┃┃ ┗━━━━━━━━━━━━━━━━━━━┛
┃┃ public static void main (String[] args)
┃┃ ┏ ┗━━━━━━━┛
┃┃ ┃ {
┃┃ ┃ System.out.println("Cześć");
┃┃ ┃ String s = "Cześć!";
┃┃ ┃ ┏┗━━━━┛
┃┃ ┃ ┃ System.out.println(s);
┃┃ ┃ ┃ if (args != NULL)
┃┃ ┃ ┃ {
┃┃ ┃ ┃ String s2 = s;
┃┃ ┃ ┃ ┗━━━━┛
┃┃ ┃ ┃ ┏
┃┃ ┃ ┃ ┃ System.out.println(s2);
┃┃ ┃ ┃ ┗
┃┃ ┃ ┃ }
┃┃ ┃ ┃ Zmienne zmienne = new Zmienne();
┃┃ ┃ ┃ System.out.println(zmienne.zmiennaInstancji);
┃┃ ┃ ┃ System.out.println(TEKST);
┃┃ ┃ ┗
┃┃ ┃ }
┃┃ ┗
┃┃ public String zmiennaInstancji;
┃┃ ┗━━━━━━━━━━━━━━━┛
┃┃ public Zmienne()
┃┃ {
┃┃ zmiennaInstancji = "Test zmiennej instancji.";
┃┃ }
┃┃}
┃┗
┗
1. Zmienna zadeklarowana w metodzie istnieje (jest widoczna) od miejsca jej deklaracji do końca tej metody.
2. Zmienna zadeklarowana w bloku kodu istnieje do końca tego bloku.
3. Parametry metody istnieją wszędzie w obrębie metody.
4. Zmienne w obiekcie istnieją przez cały okres życia obiektu, który je zawiera. Zakres ich widoczności jest regulowany przez specjalne modyfikatory dostępu.
5. Zmienne statyczne (klasy) istnieją przez cały czas działania programu. Zakres ich widoczności również jest określany przez modyfikatory dostępu.
– Racja. Pamiętam o tym.
– Świetnie. Pozwól, ze przypomnę Ci o pewnych kluczowych faktach.
– Wszystkie zmienne zadeklarowane w metodzie istnieją (są widoczne) od momentu ich zadeklarowania aż do końca metody (Przykład 1).
– Jeśli zmienna jest zadeklarowana w bloku kodu, to istnieje do końca bloku tego kodu (Przykład 2).
– Jeśli zmienna jest parametrem metody, to istnieje (jest widoczna) w całym ciele metody (Przykład 3).
– Jeśli zmienna jest zmienną instancji (Przykład 4), to jest związana z pewnym obiektem i istnieje tak długo, jak istnieje ten obiekt. Jeśli nie istnieje żaden obiekt, to nie ma instancji tej zmiennej. Możesz mieć dostęp do zmiennej (np. zmienna jest widoczna) z poziomu wszystkich metod klasy niezależnie od tego, czy były one zadeklarowane wcześniej czy później. Nowa zmienna jest tworzona dla każdego obiektu. Jest ona niezależna od innych obiektów. Nie możesz mieć dostępu do zmiennej instancji z metod statycznych.
– Jeśli zmienna jest zadeklarowana jako statyczna, np. oznaczona słowem kluczowym static, to istnieje tak długo, jak długo istnieje jej klasa. Wirtualna maszyna Java (JVM) zazwyczaj ładuje klasę do pamięci przy jej pierwszym użyciu. Wtedy też inicjalizowane są zmienne statyczne.
– Powyższy przykład deklaruje klasę Kot, która ma cztery zmienne: a, b, s (zmienne niestatyczne) i licznik (zmienna statyczna). Jeśli utworzymy kilka obiektów tej klasy (powiedzmy, trzy), każdy z nich będzie zawierał swoje własne instancje zmiennych niestatycznych tej klasy. Zmienna statyczna jest wspólna dla wszystkich obiektów klasy. Od technicznej strony, ona nawet nie znajduje się wewnątrz tych obiektów, ponieważ istniała już, zanim jakikolwiek obiekt Kot został utworzony.
– A oto, co się stanie, jeśli zadeklarujemy zmienną s
statyczną:
– OK. Myślę, że rozumiem.
Czy można zadeklarować zmienne z tą samą nazwą?
– Nie wewnątrz metody. Wszystkie zmienne deklarowane wewnątrz metody muszą mieć swoje unikalne nazwy. Argumenty metody są także uznawane za zmienne lokalne.
– A co ze zmiennymi składowymi?
– Zmienne składowe muszą być unikalne dla każdej klasy.
– Ale jest wyjątek: nazwy zmiennych lokalnych i zmiennych składowych mogą być identyczne."
– A jeśli zmienimy taką zmienną, to która z tych dwóch identycznie nazwanych zmiennych zostanie zmieniona?
– Jeśli istnieje kilka widocznych (dostępnych) zmiennych w naszym kodzie - powiedzmy, zmienna instancji i zmienna lokalna – to udostępniona zostanie zmienna lokalna.
class Main
{
public int licznik = 0; // Deklaruj zmienną instancji
public void run()
{
licznik = 15; // Dostęp do zmiennej instancji
int licznik = 10; // Deklaruj zmienną lokalną metody
licznik++; // Dostęp do zmiennej metody
}
}
– Ten kod deklaruje dwie zmienne licznikowe. Linia 3 deklaruje zmienną instancji, a linia 8 – zmienną lokalną.
– Oto, co się dzieje, kiedy metoda run jest wywoływana.
– W linii 7 mamy dostęp do zmiennej instancji i przypisujemy jej wartość 15
– W linii 8 deklarujemy (tworzymy) nową zmienną lokalną: licznik
. To przesłania zmienną instancji. Zmienna lokalna jest tym, co zobaczy (do czego będzie miał dostęp) cały następny kod metody.
– Kumam.
– Zmienna lokalna przesłania zmienną instancji. Innymi słowy, to zmienna lokalna będzie dostępna. Możesz jednak także mieć dostęp do zmiennej instancji. To jest po prostu trochę bardziej skomplikowane.
Zmienna statyczna (klasy)
|
Zmienna niestatyczna (instancji)
|
– Co jeszcze możesz mi powiedzieć o metodach statycznych i zmiennych statycznych?
– Metody statyczne i zmienne statyczne nie są związane z żadnym obiektem klasy; są związane z samą klasą. Jeśli utworzymy dziesięć obiektów Zmienne (zerknij na przykład na początku tego poziomu), będziemy mieli dziesięć zmiennych zmiennaInstancji (jedna na każdy obiekt) i tylko jedną współdzieloną zmienną (statyczną) TEKST.
– Mam pytanie.
– Jaka jest różnica między metodami statycznymi a niestatycznymi?
– Przyjrzyjmy się temu, jak działa metoda niestatyczna:
Jak wygląda kod
|
I co się naprawdę wtedy dzieje
|
– Kiedy wywołujesz metodę, używając zapisu używając zapisu <nazwa_obiektu>.<nazwa_metody>, tak naprawdę wywołujesz metodę klasy i przekazujesz ten obiekt jako pierwszy argument. Wewnątrz metody ten obiekt jest nazywany 'this'. Wszystkie operacje w metodzie są przeprowadzane na tym obiekcie i jego danych.
– Wow! A więc tak to wszystko działa!
– Właśnie tak działa metoda statyczna.
Jak wygląda kod
|
I co się naprawdę wtedy dzieje
|
– Kiedy wywołujesz metodę statyczną, nie jest do niej przekazany żaden obiekt. Innymi słowy 'this' jest równe null. To dlatego metoda statyczna nie może mieć dostępu do niestatycznych zmiennych i metod (ponieważ nie ma żadnego 'this' do przekazania tym metodom).
– Hmmm. – Myślę, że rozumiem. Przynajmniej troszeczkę.
– A teraz czas na Wujka Diego... i jego zadania.
GO TO FULL VERSION