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 za TypHodnoty.

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 v lidi1.

Kopírování obsahu pole

  • Zatímco, provedeme-li vytvoření nového pole a zavoláme metodu System.arraycopy, pak lidi2 obsahuje kopii (duplikát) původního pole.

    Person[] lidi2 = new Person[5];
    System.arraycopy(lidi, 0, lidi2, 0, lidi.length);
Note

Také arraycopy však do cílového pole zduplikuje jen odkazy na objekty People, nevytvoří kopie objektů People!