Stałe
„Amigo, czy wiesz, że w Javie nie wszystkie zmienne można zmienić?”
„Jak to, Kim? Rzeczywiście, samo słowo„ zmienna ”mówi o zmianie”.
„Co do tego nie ma wątpliwości. Podobnie jak wiele innych języków programowania, Java ma stałe , czyli zmienne, których wartości nie można zmienić . A samo słowo „stała” mówi o stałości”.
— A po co one są?
„Zwykle są one używane do jakiejś podstawowej rzeczy, takiej jak liczba Pi
lub liczba dni w miesiącach w roku. To powiedziawszy, w zasadzie programista może uczynić dowolną zmienną stałą, jeśli zdecyduje, że robienie tego tak jest konieczne”.
„Masz na myśli imię, kolor samochodu lub nazwę dnia tygodnia?”
„Masz dobry pomysł. Wszystko, czego nie powinno się zmieniać”.
„A jak te stałe wyglądają w Javie?”
„Java ma dla nich specjalne słowo kluczowe: final
. Tworzenie niezmiennej zmiennej wygląda tak samo, jak tworzenie zwykłej. Jedyna różnica polega na tym, że przed typem zmiennej należy napisać słowo final
, takie jak to:
final Type name = value;
„Co się stanie, jeśli utworzysz stałą, a następnie spróbujesz przypisać jej inną wartość?”
„To jest właściwe pytanie! A prawidłowa odpowiedź jest następująca: jeśli spróbujesz przypisać inną wartość do zmiennej final
, twój program po prostu się nie skompiluje”.
„Co się stanie, jeśli zadeklarujesz final
zmienną, ale nie przypiszesz jej wartości?”
„Nie ma sensu tego robić, więc nie jest to również dozwolone w Javie. Zmienna final
musi być zainicjowana podczas deklarowania, to znaczy należy przypisać jej wartość. Jest jeden wyjątek od tej reguły: możesz przenieść inicjalizację statyczną zmienną klasy w konstruktorze, ale o tym dowiesz się później.
To powiedziawszy, nie wszystko, co jest, final
jest stałą. Aby zmniejszyć liczbę słów kluczowych, programiści Javy używają tego słowa final
nie tylko do deklarowania stałych. final
Może to dotyczyć również metod, a nawet klas. Metod zadeklarowanych jako final
nie można przesłonić, a klasa zadeklarowane jako final
nie mogą być dziedziczone”.
„Uch… Przekreślony? Odziedziczony? W jakim języku teraz mówisz?”
„Język programowania obiektowego. Wkrótce się do niego przekonasz. Do tego czasu po prostu ciesz się piękną terminologią.”
„W porządku. Więc final
można je umieścić przed zmiennymi, klasami i metodami, a to słowo kluczowe czyni je w pewnym sensie niezmiennymi?”
„Tak. Ponadto final
modyfikator można dodać przed dowolnymi zmiennymi: zmiennymi lokalnymi, parametrami metod, polami klas i statycznymi zmiennymi klas.
„Oto ważna rzecz do zapamiętania: final
przed nazwą zmiennej jest po prostu ochrona przed wszelkimi zmianami tej zmiennej . Jeśli zmienna przechowuje odniesienie do obiektu, to obiekt nadal można zmienić”.
„Nie do końca rozumiem”.
„Zrozumiesz naprawdę wkrótce. Oto przykład:
|
Tworzymy tablicę. Nie jest to dozwolone: zmienna data jest zadeklarowana jako final . Ale możesz to zrobić. A także to. |
„Rozumiem. To trudne”.
Stałe globalne
„Jak myślisz, czym są stałe globalne?”
„Domyślam się, że stałe globalne są prawdopodobnie jak zmienne globalne, tylko stałe?”
„Dokładnie. Jeśli chcesz zadeklarować stałe globalne w swoim programie, utwórz zmienne klasy statycznej i zrób z nich public
i final
. Istnieje specjalny styl nazw takich zmiennych: są one pisane wielkimi literami, ze znakiem podkreślenia używanym do oddzielne słowa.
Przykłady:
class Solution
{
public static final String SOURCE_ROOT = "c:\\projects\\my\\";
public static final int DISPLAY_WIDTH = 1024;
public static final int DISPLAY_HEIGHT = 768;
}
Zmienne cieniowanie
„Jak powiedziałem wcześniej, nie można utworzyć wielu zmiennych lokalnych o tych samych nazwach w jednej metodzie. W różnych metodach jest to możliwe”.
"Wiem to!"
„Ale prawdopodobnie nie wiesz, że zmienne w klasie i zmienne lokalne w metodzie mogą mieć tę samą nazwę.
Przykład:
Kod | Zmienna widoczność |
---|---|
|
|
„W add
metodzie zadeklarowaliśmy zmienną lokalną o nazwie sum
. Do końca metody zasłania ona (lub maskuje ) sum
zmienną instancji”.
„Hmm… powiedziałbym, że w pewnym sensie jest to oczekiwane zachowanie”.
„Ale to nie koniec historii. Okazuje się, że jeśli zmienna instancji jest zacieniona przez zmienną lokalną, nadal istnieje sposób na odwołanie się do zmiennej instancji w ramach metody. Robimy to, wpisując słowo kluczowe przed jego this
nazwą :
this.name
„Oto przykład pomyślnego rozwiązania konfliktu nazw:
Kod | Zmienna widoczność |
---|---|
|
|
Zmienne count
i sum
są dostępne wszędzie ze this
słowem kluczowym lub bez niego. W wierszach, w których sum
zmienna lokalna przesłania zmienną sum
instancji, sum
dostęp do zmiennej instancji można uzyskać tylko za pomocą this
słowa kluczowego.
- Oczywiście, będę musiał to przećwiczyć.
— Poradzisz sobie.
„Co się stanie, jeśli statyczna zmienna klasy jest przesłonięta, a nie tylko (niestatyczna) zmienna instancji? Nie możesz uzyskać do niej dostępu przez this
?”
„Zgadza się. Słowo kluczowe this nie zadziała. Musisz odnieść się do niego poprzez nazwę klasy:
ClassName.name
Przykład:
Kod | Zmienna widoczność |
---|---|
|
|
„Uwaga: możesz uzyskać dostęp do zmiennych statycznych count
i sum
wszędzie, używając nazwy klasy Solution
jako prefiksu lub bez niej. W tych wierszach, w których sum
zmienna lokalna zasłania sum
zmienną instancji, dostęp do sum
zmiennej klasy jest możliwy tylko wtedy, gdy jest używany Solution
jako prefiks.
Zmienne wewnątrz for
pętli
„I jeszcze jeden mały, ale interesujący fakt. Jest też miejsce, w którym zmienna jest deklarowana w specjalny sposób — mówię o wewnątrz pętli for
” . Zazwyczaj for
pętla ma counter
zmienną w nawiasach. A jaka będzie widoczność tej zmiennej? W końcu nie znajduje się w ciele pętli. Czy to cała metoda? Albo nie?"
„Coś już o tym słyszałem. Jak rozumiem, zmienna zadeklarowana w nagłówku pętli for
jest widoczna tylko w ciele pętli iw nagłówku pętlifor
”.
„Dobra robota, Amigo. Ale mimo to spójrz na przykład wzmacniający ten materiał:
Kod | Zmienna widoczność |
---|---|
|
|
„Więc mówisz, że w moim kodzie mógłbym napisać kilka pętli jedna po drugiej ze zmienną licznika o tej samej nazwie i nie byłoby problemów?”
„Nie byłoby problemów. Proszę spojrzeć:
Kod | Zmienna widoczność |
---|---|
|
|
GO TO FULL VERSION