CodeGym /Kursy Java /Składnia Java /Więcej o zasięgu zmiennych (scope)

Więcej o zasięgu zmiennych (scope)

Składnia Java
Poziom 4 , Lekcja 1
Dostępny

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

Więcej o zasięgu zmiennych (scope) – 1

– 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ą:

Więcej o zasięgu zmiennych (scope) – 2

– 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.&#34

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

Przykład z dwiema zmiennymi licznikowymi
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)
NazwaKlasy.nazwaZmiennej

// Oto kilka przykładów:
Kot.licznikKotow
Zmienna niestatyczna (instancji)
this.nazwaZmiennej

// Oto kilka przykładów:
this.kotyLicznik

– 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
Kot kot = new Kot();
String imie = kot.getImie();
kot.setWiek(17);
kot.setDzieci(kot1, kot2, kot3);
I co się naprawdę wtedy dzieje
Kot kot = new Kot();
String imie = Kot.getImie(kot);
Kot.setWiek(kot,17);
Kot.setDzieci(kot, kot1, kot2, kot3);

– 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
Kot kot1 = new Kot();
Kot kot2 = new Kot();
int licznikKotow = Kot.getLicznikWszystkichKotow();
I co się naprawdę wtedy dzieje
Kot kot1 = new Kot();
Kot kot2 = new Kot();
int licznikKotow = Kot.getLicznikWszystkichKotow(null);

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

Komentarze (25)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Dawid Poziom 10, Poland
25 listopada 2023
To z jabłkami niby proste ale jednak (jak dla mnie :D) zagmatwane. Dopiero po którymś razie czytając lekcje na głos i starając się zrozumieć każde słowo + słowo po słowie rozgryzać kod w końcu samodzielnie się udało. Mega satysfakcja <3
Anonymous #11274698 Poziom 8, Gorzow Wielkopolski, Poland
10 maja 2023
Mógłby mi ktoś podać definicję zmiennych lokalnych składowych i globalnych?
Anonymous #11274698 Poziom 8, Gorzow Wielkopolski, Poland
10 maja 2023
Wszędzie gdzie szukam definicji zmiennej instancji jest napisane że to zmienna niestatyczna. Dlaczego więc tutaj jest statyczna?
Aleksandra Poziom 11, Poland, Poland
27 października 2022
Hej! Czy ktoś mógłby mi proszę wyjaśnić to zadanie z jabłkami? Jak dla mnie obiekt jabłko ma ustawioną cenę na 0 w linii 17, a więc w linii 20 dodaję do siebie dwa 0. Nie widzę, aby w linii 17 zostało pobrane to co zostało zadeklarowane w liniach 10 i 12, a jednak tak się musi dziać, skoro wynik jest prawidłowy. Czy ktoś mógłby mi wskazać jak to się dzieje?
Grzegorz Poziom 16, Pszczyna, Poland
31 października 2022
Zmienna statyczna cenaJablek to zmienna, która jest wspólną "własnością" innych obiektów i pobiera pamięć raz dla danej klasy. Inaczej ujmując - zmienna ta jest współdzielona przez wszystkie obiekty i pamięć przydzielana jest tylko raz. Dlatego obiekt jablko jak i jablko2 po wywołaniu metody podniesCene() będą w stanie manipulować wartością zmiennej cenaJablek.
Molo Poziom 41, Jacksonville, Dania
17 sierpnia 2022
jak ktoś ma problem z jabłkami niech się przewietrzy albo nast dnia niech siądzie i przeczyta końcówkę artykułu :]
Aleksandra Poziom 11, Poland, Poland
27 października 2022
Jakiś "mądry", może sam się przewietrz? Nie zawsze sposób w jakiś coś jest wyjaśnione jest tak samo jasny dla każdego, czasem potrzeba kogoś kto by to dla nas sparafrazował. Jak się przewietrzysz, to może zrozumiesz.
Pighost Poziom 17, Warszawa, Poland
27 lipca 2020
W pierwszym przykładzie tego zadania jest "private static void String TEKST = "Koniec.";" czy to aby nie jest błąd?
Robert Poziom 20, Debica, Poland
3 maja 2020
Cześć, Dlaczego w IntelliJ w zadaniu 401 (i innych zadaniach, od jakiegoś czasu) gdy, spróbuje go uruchomić - Lewy przycisk myszy -> Run "Solution" lub "Ctrl + Shift + F10". Uruchamia mi inne zadanie? Dołączam link wideo https://drive.google.com/open?id=1WF_YZ7R1eNsweAn0I22bJ61OM6vjDINn Jak to naprawić?
Karol Grzeszczak Poziom 31, Poland, Poland
15 maja 2022
ja mam ten sam problem
Tasmandev Poziom 9, Poland, Poland
22 września 2022
Pewnie dlatego, że w innych zadaniach również masz metodę main, która powinna być tylko jedna. W moim przypadku pomaga usuwanie poprzednich zadań z programu tak aby w projekcie było tylko jedno z metodą main.
Krzysztof Poziom 7, Kraków , Polska
21 kwietnia 2020
Nie rozumiem tego: 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. Jest ktoś kto potrafi mi to wytłumaczyć na przykładzie, bądź jakkolwiek bo już zgłupiałem chyba ;(
Dariusz W Poziom 8, Tarnow, Poland
16 marca 2020
Utknąłem i zawiesiłem kurs na dwie godziny żeby poczytać "Java. Rusz głową!". Zdecydowanie pomaga zrozumieć składnię do tego momentu. Łopatologicznie wyjaśnione, kreatywne i zabawne. Polecam! "Thinking in Java" też dużo tłumaczy ale, z punktu widzenia żółtodzioba, czytając łatwo się pogubić w zawartych tam technicznych/historycznych/filozoficznych niuansach.
Robert Poziom 20, Debica, Poland
3 maja 2020
Zaraz wyrzucę monitor przez okno, który konkretnie rozdział, strona, ...proszę.
Magdalena Poziom 5, Gdynia, Poland
3 marca 2020
Cześć, czy mógłby mi ktoś wytłumaczyć zadanie 2 "cena jabłek"? Tak na "chłopski rozum". Uczę się Javy od niedawna i do tej pory nie miałam większych problemów na tym kursie, a teraz utknęłam :( i po prostu tego nie rozumiem.
Przemysław Ziegert Poziom 11, Gdansk, Poland
5 marca 2020
Przeczytaj ten fragment kilka razy to zrozumiesz Kiedy wywołujesz metodę, używając zapisu  <nazwa_obiektu>.<nazwa_metody>(Jabłko.cenaJabłka), 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.
Magdalena Poziom 5, Gdynia, Poland
21 marca 2020
Dziękuje ! Bardzo mi pomogłeś :)