undefined

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.

undefined
4
Zadanie
Składnia Java, poziom 4, lekcja 1
Niedostępne
Ten wiek źle na mnie działa...
Czasami każdy z nas chciałby być w innym wieku. Albo nie chcą ci sprzedać papierosów i piwa... ...albo zaczynasz siwieć i niemiłosiernie bolą Cię plecy. Programista niekoniecznie może mieć kontrolę nad czasem, ale z pewnością może kontrolować dane w programach. W tym zadaniu poprawimy pewien błąd, przez który zmienna wiek obiektu klasy Osoba otrzyma inną wartość.
undefined
4
Zadanie
Składnia Java, poziom 4, lekcja 1
Niedostępne
Cena jabłek
Na rolniczej planecie Jabłuszko zdecydowana większość mieszkańców zarabia, sprzedając najlepsze jabłka po tej stronie Galaktyki Federacyjnym statkom handlowym i turystom. Nawiążmy relację biznesową z abstrakcyjnym kupcem. Załóżmy, że kończy się sezon i musimy jakoś przetrwać zimę: napisz metodę, która podnosi cenę jabłek!
Komentarze (14)
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION
Pighost Poziom 16 Warszawa
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 8 Debica
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ć?
Krzysztof Poziom 7 Kraków
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
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.
Magdalena Poziom 5 Gdynia
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.
Łukasz Poziom 4 London
18 grudnia 2019
witam, jak zrobic by kod wypisywal cena jablek dwarazy ,robi mi tylko raz ten drugi czyli 100
Grzegorz Romanowski Poziom 7 Gdańsk
3 grudnia 2019
Ktoś rozwiązał te dwa zadanka?