Pole v Javě jako objekt
-
Pole v Javě je speciálním objektem.
-
Můžeme mít pole jak primitivních, tak objektových typů:
-
pole primitivních hodnot tyto hodnoty přímo obsahuje
-
pole objektů obsahuje odkazy na objekty
-
Note
|
Kromě pole v Javě existují i jiné objekty na ukládání více prvků, tzv. kontejnery, viz další přednášky. |
Deklarace
-
Syntaxe deklarace pole:
TypHodnoty[] jménoPole
-
Na rozdíl od C/C++ nikdy neuvádíme při deklaraci počet prvků pole — ten je podstatný až při vytvoření (objektu) pole
-
Rovněž tak na rozdíl od C/C++ píšeme závorky
[]
vždy hned zaTypHodnoty
.
Vytvoření
-
Vytvoření (objektu) pole se děje stejně jako u jiných objektů operátorem
new
: -
jménoPole = new TypHodnoty[ početprvků ];
-
nebo vzniklé pole rovnou naplníme hodnotami/odkazy (pak je zbytečné uvádět počet):
-
+ jménoPole = new TypHodnoty[] {prvek1, prvek2, …};+
Přístup k prvkům
Syntaxi přístupu k prvkům jménoPole[indexprvku] používáme pro:
- přiřazení prvku do pole
-
jménoPole[indexprvku] = hodnota;
- čtení hodnoty z pole
-
proměnná = jménoPole[indexprvku];
Příklad — deklarace, vytvoření
-
Pole je objekt, je třeba ho před použitím nejen deklarovat, ale i vytvořit:
Person[] lidi; lidi = new Person[5];
-
Deklaraci a vytvoření lze zkombinovat na jeden řádek:
Person[] lidi = new Person[5];
-
Zkrácení je však pouze "syntaktickým cukrem", nemá žádný vliv na rychlost běhu, spotřebu paměti atd.
Příklad — naplnění, použití
-
Nyní můžeme pole naplnit:
lidi[0] = new Person("Petr Nečas"); lidi[1] = new Person("Jana Nagyová"); lidi[0].writeInfo(); lidi[1].writeInfo();
-
Nyní jsou v poli
lidi
naplněny první dva prvky odkazy na objekty. -
Zbylé prvky zůstaly naplněny prázdnými odkazy
null
.
Když deklarujeme, ale nevytvoříme — atribut
public class Pokus { static String[] pole; public static void main(String args[]) { pole[0] = "Neco"; } }
-
Pole je zde atributem, byť statickým.
-
Pole není vytvořeno.
-
Překladač chybu neodhalí a po spuštění se objeví:
Exception in thread "main" java.lang.NullPointerException at Pokus.main(Pokus.java:4)
Když deklarujeme, ale nevytvoříme — lokální proměnná
-
Pokud tuto chybu uděláme v rámci metody:
public class Pokus { public static void main(String args[]) { String[] pole; pole[0] = "Neco"; } }
-
Překladač nás varuje:
Pokus.java:4: variable pole might not have been initialized pole[0] = "Neco"; ^ 1 error
Když deklarujeme, vytvoříme, ale nenaplníme
-
Co kdybychom pole deklarovali, vytvořili, ale nenaplnili příslušnými prvky:
Person[] lidi; lidi = new Person[5]; lidi[0].writeInfo();
-
Toto by skončilo také s běhovou chybou
NullPointerException
, protože pole existuje, má pět prvků, ale první z nich je prázdný, nelze tudíž volat jeho metody (resp. vůbec používat jeho vlastnosti)!
Kopírování odkazu na pole
-
V Javě obecně přiřazení proměnné objektového typu vede pouze k duplikaci odkazu, nikoli celého odkazovaného objektu.
-
V Javě jsou pole objekty, tzn. prosté přiřazení jedné proměnné typu pole do druhé znamená zkopírování pouze odkazu na toto pole.
Person[] lidi2; lidi2 = lidi1;
-
V proměnné
lidi2
je nyní odkaz na identické pole jako je vlidi1
.
Kopírování obsahu pole
-
Zatímco, provedeme-li vytvoření nového pole a zavoláme metodu
System.arraycopy
, paklidi2
obsahuje kopii (duplikát) původního pole.Person[] lidi2 = new Person[5]; System.arraycopy(lidi, 0, lidi2, 0, lidi.length);
Note
|
Také |