Platnost proměnných
Z MiS
(Rozdíly mezi verzemi)
(Přidány příklady a podrobnější popis.) |
(→Instanční a třídní atributy — obrázek: Přidán příklad s obrázky.) |
||
Řádka 52: | Řádka 52: | ||
== Instanční a třídní atributy — obrázek == | == Instanční a třídní atributy — obrázek == | ||
+ | Vezměme následující kód: | ||
+ | class Zelva { | ||
+ | int i = 0; | ||
+ | static int t = 0; | ||
+ | |||
+ | void f() { | ||
+ | int lp = 0; | ||
+ | } | ||
+ | } | ||
+ | První obrázek popisuje stav před vytvořením první instance: | ||
+ | * Zatím je k dispozici jen třídní atribut <code>t</code>. | ||
+ | * Instanční atribut <code>i</code> se zatím nevytváří. | ||
+ | [[Image:var_static_inst1.png]] | ||
+ | Druhý obrázek popisuje stav po vytvoření první instance: | ||
+ | * Instanční atribut <code>i</code> se vytvořil pro první vytvořenou instanci. | ||
+ | * Instance sdílí hodnotu třídního atributu <code>t</code> (již dříve vytvořeného). | ||
+ | [[Image:var_static_inst2.png]] | ||
+ | |||
+ | Třetí obrázek popisuje stav po vytvoření druhé instance: | ||
+ | * Instanční atribut <code>i</code> se vytvořil pro první i druhou vytvořenou instanci. | ||
+ | * Každá má svou hodnotu <code>i</code>. | ||
+ | * Obě instance sdílí hodnotu třídního atributu <code>t</code> (již dříve vytvořeného). | ||
+ | [[Image:var_static_inst3.png]] | ||
== Lokální proměnné == | == Lokální proměnné == |
Aktuální verze z 5. 4. 2016, 11:19
Obsah[skrýt] |
Třídní atributy
- Popisují vlastnosti celé třídy.
- Jejich hodnota je společná pro všechny objekty (instance) dané třídy.
- Jsou k dispozici po celou dobu spuštění programu.
- Nejsou závislé na existenci instance.
- Označují se klíčovým slovem:
static
- Typické použití — počítač instancí
public class Auto { private static int pocetAut = 0; ... public Auto() { Auto.pocetAut++; ... } ... }
Instanční atributy
- Popisují vlastnosti konkrétní instance.
- Každá instance má svoji vlastní hodnotu.
- Vytváří se při vytvoření instance a s ní také zanikají, jsou k dispozici po celou dobu existence instance.
- Není potřeba psát žádné klíčové slovo.
Příklady: Instanční × třídní atributy
Příklad 1 — Škoda Octavia
-
Množství paliva v nádrži
je instanční atribut.- Jedna Octavia má jiné množství paliva v nádrži než jiná.
- Nemá smysl mluvit obecně o množství paliva v nádrži Škody Octavia, protože každý konkrétní automobil má množství paliva aktuálně jiné.
-
Doporučený interval výměny svíček
je třídní atribut.- Interval platí pro všechny automobily daného typu (dané motorizace).
- Pokud výrobce interval změní, bude platit opět pro všechny automobily daného typu — i ty už vyrobené, i ty, které teprve vyrobíme.
Příklad 2 — Lak na nehty
-
Množství laku v lahvičce
je instanční atribut.- Koupím-li novou lahvičku, bude plná. Starší lahvička je již skoro vyčerpaná.
- Nemá smysl mluvit obecně o množství laku, protože hodnota je pro každou lahvičku jiná.
-
Doporučený odlakovač
je třídní atribut.- Platí pro všechny lahvičky (instance) daného typu laku.
- Pokud výrobce změní doporučení, bude platit opět pro všechny instance daného typu — i ty už nakoupené, i ty, které teprve vyrobíme/nakoupíme.
Instanční a třídní atributy — obrázek
Vezměme následující kód:
class Zelva { int i = 0; static int t = 0; void f() { int lp = 0; } }
První obrázek popisuje stav před vytvořením první instance:
- Zatím je k dispozici jen třídní atribut
t
. - Instanční atribut
i
se zatím nevytváří.
Druhý obrázek popisuje stav po vytvoření první instance:
- Instanční atribut
i
se vytvořil pro první vytvořenou instanci. - Instance sdílí hodnotu třídního atributu
t
(již dříve vytvořeného).
Třetí obrázek popisuje stav po vytvoření druhé instance:
- Instanční atribut
i
se vytvořil pro první i druhou vytvořenou instanci. - Každá má svou hodnotu
i
. - Obě instance sdílí hodnotu třídního atributu
t
(již dříve vytvořeného).
Lokální proměnné
- Pomocné proměnné, které vytváříme v rámci kódu metod.
- Jsou k dispozici pouze v bloku, ve kterém byly vytvořeny (metoda, tělo cyklu, kód podmíněného příkazu,...)
- Úkol — Co je špatně na následujícím kódu?
Kód má počítat celkovou částku na výplaty.
for (Zamestnanec z : zamestnanci) { int celkem += z.getCastka(); } System.out.println(celkem);
Jak kód opravíte?