Zmienna to "pojemnik" na informacje, która może przechowywać tekst, liczby, wartość logiczną, kolekcję lub obiekty:
int liczba = 54;
String tekst = "Cześć, co tam?";
float ulamek = 5.3413; // mniejsza dokładność
double ulamek2 = 5.1235123412321; // większa dokładność
boolean prawdaFalsz = true;
String[] kilkaTekstow = new String[] { 'Hej', 'co', 'tam?' };
Klasa obiekt = new Klasa();
W zależności od tego gdzie taka zmienna zostanie zadeklarowana będzie zachowywała się trochę inaczej i będzie miała inną charakterystykę. Te które mają inną widoczność mają z reguły inne nazwy.
Zmienna może być zadeklarowana tak aby:
- Była dostępna (widoczna) w całej klasie.
- Była dostępna w pojedynczej metodzie/bloku.
- Była dostępna w jednym pliku lub w całym programie.
Pola to zmienne które zostały zadeklarowane w klasie, tak że każda metoda w niej ma do niej dostęp. Może odczytać lub zmienić jej wartość.
class Klasa {
public String pole; // zmienna, która jest polem
void zmien() {
pole = "inna wartosc";
}
String odczytaj() {
return pole;
}
}
Oczywiście można zadeklarować pole w taki sposób by było stałą, ale przez swoją widoczność ciągle jest nazywane polem.
class Klasa {
public final String pole; // stała, która jest polem
void zmien() {
pole = "inna wartosc"; // Błąd składni, program się nie skompiluje
}
}
Zmienne które nie są widoczne w całej klasie nazywane są często po prostu zmienną albo "zmienną lokalną". Charakteryzują się tym że jeżeli stworzy się taką zmienną w jednym bloku (np ifie albo forze, lub w funkcji), to taka zmienna nie będzie istniała poza nią.
class Klasa {
void set() {
String zmienna = "something";
}
String get() {
return zmienna; // Błąd składni, program się nie skompiluje.
if (true) {
int liczba = 24;
}
return liczba.toString(); // Błąd składni, zmienna liczba jest zadeklarowana w ifie
}
}
Wydaje mi się że takim "szczególnym" przypadkiem zmiennej jest parametr przekazywany metodzie. On również jest widoczny tylko w niej
class Klasa {
String get(String parametr) {
return parametr; // Zmienna parametr również jest widoczna tylko tutaj.
}
}
Klasa obiekt = new Klasa();
obiekt.get("Czesc"); // Wartość "Cześć" będzie teraz wartością parametru "parametr"
Kolejnym przykładem mogą być zmienne globalne, które da się stworzyć w niektórych językach. Można je ustawiać i odczytywać z (zależnie od języka) dowolnej metody globalnej czy klasy.
Ostatnie co może być to podzielenie zmiennych "zwykłych" i statycznych. Pola statyczne to również są zmienne nazywane "polami statycznymi" albo tak, jak ja lubię "staticami". Mają zwiększoną widoczność ponieważ należą do klasy, a nie do obiektu tej klasy. Zmienne statyczne są współdzielone przez obiekty danej klasy, w odróżnieniu do dynamicznych, które każdy obiekt ma jakby "na własność".
class Klasa {
static int staticVariable;
int dynamicVariable;
void increaseStatic() {
staticVariable++;
}
void increaseDynamic() {
dynamicVariable++;
}
}
Klasa obiekt1 = new Klasa();
Klasa obiekt2 = new Klasa();
obiekt1.increaseStatic(); // zmienna statyczna (współdzielona) ma teraz wartość 1
obiekt1.increaseDynamic(); // zmienna dynamiczna ma teraz wartość 1
obiekt2.increaseStatic(); // zmienna statyczna (współdzielona) ma teraz wartość 2
obiekt2.increaseDynamic(); // zmienna dynamiczna ma teraz wartość 1
Pole - zmienna lub stała należąca widoczna w klasie (statyczne lub nie)
Zmienna lokalna - zmienna widoczna tylko w metodzie lub bloku (if/for)