Otázka: Jak mohu použít řadu polí?
A:
String s = new String ("Hello, World"); // s je odkaz na řetězec, který odkazuje na objekt // řetězec s hodnotou „Hello, World.“ s = nový řetězec ("Guten Tag, Welt"); // Stejné String reference s nyní odkazuje // na jiný String objekt; tj. // jedna reference odkazovala na dva // různé objekty (za sebou). // (Všimněte si, že nyní máme objekt String // s hodnotou „Hello, World“, který nemá žádné // odkazy; proto je tento objekt způsobilý // být smeten) String t; // t je odkaz na řetězec s nulovou hodnotou // (neodkazuje na žádný objekt). // Pokud se v tuto chvíli pokusíte použít t, např. // vyslovením int len = t.length; dostanete // NullPointerException (mělo by se jmenovat // NullReferenceException). t = s; // Odkaz na řetězec t nyní odkazuje na stejný // objekt, na který odkazují odkazy na řetězec, // jmenovitě na řetězec objekt s hodnotou „Guten Tag, Welt“. // Takže zde máme dva // odkazy na jeden objekt (souběžně).
Pole v Javě jsou samy o sobě objekty, ať už obsahují primitiva (int
s, char
s, booleovský
s atd.) nebo obsahují jiné objekty. To znamená, že na pole se odkazuje jako na jakýkoli jiný objekt s přidáním []
sémantika agregace / dereference. Zde je příklad:
Řetězec [] sa; // sa je nulová reference // pokus o přístup k sa.length způsobí NullPointerException. sa = nový řetězec [2]; // sa už není nulovým odkazem, odkazuje na konkrétní // objekt, který je polem dvou nulových řetězcových odkazů. // sa.length je nyní roven 2 // (sa [0] a sa [1] jsou dva nulové odkazy na řetězce). sa [0] = "Dobrý den, svět"; sa [1] = "Guten Tag, Welt"; // Nyní sa odkazuje na pole dvou nenulových řetězcových odkazů. sa = nový řetězec [1]; // sa.length se rovná 1 // Stejná reference sa nyní odkazuje na jiné // (a kratší) pole. // sa [0] je null String reference // pokus o přístup k sa [1] způsobí // ArrayIndexOutOfBoundsException. sa [0] = "Dobrý den, svět"; // sa [0] má nyní nenulovou hodnotu.
Vaše otázka týkající se polí může být zodpovězena zvážením toho
Řetězec [] [] saa; saa [0] [0] = "Nápověda";
způsobí a NullPointerException
, protože saa
je nulová reference - to znamená, saa
neodkazuje na žádný objekt. Chcete-li přiřadit hodnotu prvnímu prvku prvního pole, saa
musí odkazovat na pole s délkou větší než nula a saa [0]
musí odkazovat na nenulové řetězcové pole, jehož délka je také větší než nula. Dalo by se tedy začít slovy:
Řetězec [] [] saa; // saa je nulový odkaz na pole řetězcových polí // Pokus o saa.length již způsobí NullPointerException, // jako to dělá saa [0]. saa = nový řetězec [1] []; // saa nyní odkazuje na pole 1 nulového odkazu na String []. // saa.length se rovná 1. // saa [0] je null. saa [0] = nový řetězec [2]; // saa nyní odkazuje na pole 1 nenulového odkazu // na řetězec [] o délce 2. // saa.length je stále rovna 1. // saa [0] .length je rovna 2 (ale saa [0] [0] a // saa [0] [1] jsou oba null). saa [0] [0] = "Dobrý den, svět"; saa [0] [1] = "Guten Tag, Welt"; // Nyní saa [0] [0] a saa [0] [1] jsou oba nenulové.
Všimněte si, že nemůžete odkazovat saa [0] [0]
dokud saa [0]
je nenulové a nemůžete to udělat saa [0]
nenulová, dokud nevytvoříte saa
nenulový. V zásadě musíte postupně vytvářet řadu polí.
Pro inicializaci odkazů na pole existuje snadno použitelná zkratka:
String [] [] saa = {{{"" Hello, World}, {"Guten Tag, Welt"}}}}; // vytvoří objekt String [] [] jako ten, který vytvořil // výše a přiřadí saa odkaz na tento objekt. // Mezery mají zdůraznit, že // vytvořený objekt je pole jednoho řetězce [], který // obsahuje dva řetězce.
Pomocí této zkratky lze náš příklad správně zapsat jako:
Řetězec [] [] saa = {{{"Nápověda"}}};
To však dělá saa
odkazují na pole řetězců jeden po druhém. Všimněte si, že výše uvedená syntaxe funguje pouze při inicializaci odkazu na pole (inicializace je speciální případ přiřazení v době deklarace). Obecnější způsob vytvoření nového pole a jeho přiřazení k novému nebo stávajícímu odkazu na pole vypadá takto (v případě existujícího odkazu):
saa = new String [] [] {// všimněte si prázdného [] [] - kompilátor zjistí // velikost ven (je vyžadováno prázdné [] []). {{"" Hello "}, {" World "}} // toto je saa [0], // všimněte si čárky oddělující saa [0] a saa [1] {{" Guten Tag "}, {" Welt "} } // toto je saa [1]}; // nyní saa.length = 2 a saa [0] a saa [1] mají také délku 2Random Walk Computing je největší konzultační butik Java / CORBA v New Yorku se zaměřením na řešení pro finanční podniky. Konzultanti Random Walk, známí svými špičkovými znalostmi prostředí Java, publikují a mluví o prostředí Java na některých z nejrespektovanějších fór na světě.
Tento příběh „Array of arrays“ původně publikoval JavaWorld.