Sprievodca vytváraním objektov v prostredí Java

1. Prehľad

Jednoducho povedané, skôr ako budeme môcť pracovať s objektom na JVM, musí sa najskôr inicializovať.

V nasledujúcich častiach sa pozrieme na rôzne spôsoby, ako môžeme inicializovať primitívne typy a objekty.

2. Deklarácia vs. inicializácia

Začnime tým, že sme na rovnakej stránke.

Deklarácia je proces definovania premennej spolu s jeho typom a názvom.

Tu vyhlasujeme id premenná:

int id;

Inicializácia je na druhej strane všetko o priradení hodnoty; napríklad:

id = 1;

Na demonštráciu vytvoríme a Používateľ trieda s a názov a id vlastnosti:

public class User {private String name; private int id; // štandardný konštruktor, getre, setre,}

Ďalej uvidíme, že inicializácia funguje odlišne v závislosti od typu poľa, ktoré inicializujeme.

3. Predmety vs. primitívy

Java poskytuje dva typy reprezentácie údajov: primitívne typy a referenčné typy. V tejto časti si rozoberieme rozdiely medzi nimi, pokiaľ ide o inicializáciu.

Java má osem zabudovaných dátových typov, ktoré sa označujú ako primitívne typy Java; premenné tohto typu majú svoje hodnoty priamo.

Typy odkazov obsahujú odkazy na objekty (inštancie tried). Na rozdiel od primitívnych typov, ktoré uchovávajú svoje hodnoty v pamäti, kde je alokovaná premenná, referencie nedržia hodnotu objektu, na ktorý odkazujú.

Namiesto toho referencia smeruje k objektu uložením adresy pamäte, kde sa nachádza objekt.

Upozorňujeme, že Java nám neumožňuje zistiť, čo je adresa fyzickej pamäte. Namiesto toho môžeme odkazom iba odkazovať na objekt.

Pozrime sa na príklad, ktorý deklaruje a inicializuje referenčný typ z nášho Používateľ trieda:

@Test public void whenIntializedWithNew_thenInstanceIsNotNull () {User user = new User (); assertThat (užívateľ) .isNotNull (); }

Ako tu vidíme, k novému je možné priradiť odkaz pomocou kľúčového slova Nový, ktorý je zodpovedný za vytvorenie nového Používateľ objekt.

Poďme sa dozvedieť viac o vytváraní objektov.

5. Vytváranie objektov

Na rozdiel od primitívov je vytváranie objektov o niečo zložitejšie. Je to preto, že do poľa nepridávame iba hodnotu; namiesto toho spustíme inicializáciu pomocou Nový kľúčové slovo. Toto na oplátku vyvolá konštruktor a inicializuje objekt v pamäti.

Poďme diskutovať o konštruktéroch a Nový kľúčové slovo podrobnejšie.

The Nový kľúčové slovo je zodpovedný za pridelenie pamäte pre nový objekt prostredníctvom konštruktora.

Na inicializáciu premenných inštancií predstavujúcich hlavné vlastnosti vytvoreného objektu sa zvyčajne používa konštruktor.

Ak výslovne nedodáme konštruktor, kompilátor vytvorí predvolený konštruktor, ktorý nemá žiadne argumenty a iba alokuje pamäť pre objekt.

Trieda môže mať veľa konštruktorov, pokiaľ sú ich zoznamy parametrov odlišné (preťaženie). Každý konštruktor, ktorý nevolá iného konštruktora v rovnakej triede, má volanie svojho nadradeného konštruktora, či už bol napísaný explicitne, alebo vložený kompilátorom prostredníctvom Super().

Pridajme do nášho konstruktor Používateľ trieda:

public User (meno reťazca, int id) {this.name = meno; this.id = id; }

Teraz môžeme pomocou nášho konštruktora vytvoriť a Používateľ objekt s počiatočnými hodnotami pre svoje vlastnosti:

User user = new User ("Alice", 1);

6. Variabilný rozsah pôsobnosti

V nasledujúcich častiach sa pozrieme na rôzne typy rozsahov, v ktorých môže premenná v Jave existovať, a na to, ako to ovplyvňuje proces inicializácie.

6.1. Premenné inštancie a triedy

Premenné inštancie a triedy nevyžadujú, aby sme ich inicializovali. Hneď ako deklarujeme tieto premenné, dostane sa im predvolená hodnota nasledovne:

Teraz sa pokúsime definovať niektoré inštancie a triedy spojené s premennými a otestovať, či majú alebo nemajú predvolenú hodnotu:

@Test public void whenValuesAreNotInitialized_thenUserNameAndIdReturnDefault () {User user = new User (); assertThat (user.getName ()). isNull (); assertThat (user.getId () == 0); }

6.2. Miestne premenné

Pred použitím je potrebné inicializovať lokálne premenné, pretože nemajú predvolenú hodnotu a kompilátor nám nedovolí použiť neinicializovanú hodnotu.

Napríklad nasledujúci kód generuje chybu kompilátora:

public void print () {int i; System.out.println (i); }

7. The Konečné Kľúčové slovo

The konečné kľúčové slovo použité na pole znamená, že hodnotu poľa po inicializácii už nie je možné zmeniť. Týmto spôsobom môžeme definovať konštanty v Jave.

Pridajme konštantu k nášmu Používateľ trieda:

súkromný statický konečný int ROK = 2000;

Konštanty musia byť inicializované buď keď sú deklarované, alebo v konštruktore.

8. Inicializátory v Jave

V prostredí Java, an initializer je blok kódu, ktorý nemá priradený názov ani dátový typ a je umiestnený mimo akejkoľvek metódy, konštruktora alebo iného bloku kódu.

Java ponúka dva typy inicializátorov, statické a inštančné inicializátory. Pozrime sa, ako môžeme každú z nich využiť.

8.1. Inicializátory inštancií

Tieto môžeme použiť na inicializáciu inštančných premenných.

Na ukážku poskytneme hodnotu pre používateľa id pomocou inicializátora inštancie v našom Používateľ trieda:

{id = 0; }

8.2. Blok statickej inicializácie

Statický inicializátor alebo statický blok - je blok kódu, ktorý sa používa na inicializáciu statický polia. Inými slovami, ide o jednoduchý inicializátor označený kľúčovým slovom statický:

súkromné ​​statické fórum String; static {forum = "Java"; }

9. Poradie inicializácie

Pri písaní kódu, ktorý inicializuje rôzne typy polí, samozrejme musíme dávať pozor na poradie inicializácie.

V prostredí Java je poradie inicializačných príkazov nasledovné:

  • statické premenné a statické inicializátory v poradí
  • inštančné premenné a inicializátory inštancií v uvedenom poradí
  • konštruktéri

10. Životný cyklus objektu

Teraz, keď sme sa naučili, ako deklarovať a inicializovať objekty, poďme zistiť, čo sa stane s objektmi, keď sa nepoužívajú.

Na rozdiel od iných jazykov, kde sa musíme báť ničenia objektov, sa Java stará o zastarané objekty prostredníctvom svojho zberača odpadu.

Všetky objekty v Jave sú uložené v halde pamäte nášho programu. V skutočnosti halda predstavuje veľkú skupinu nevyužitej pamäte pridelenej pre našu aplikáciu Java.

Na druhej strane garbage collector je program Java, ktorý sa stará o automatickú správu pamäte odstránením objektov, ktoré už nie sú dosiahnuteľné.

Aby sa objekt Java stal nedostupným, musí sa vyskytnúť jedna z nasledujúcich situácií:

  • Objekt už nemá žiadne odkazy na neho smerujúce
  • Všetky odkazy smerujúce na objekt sú mimo rozsahu pôsobnosti

Záverom možno povedať, že objekt je najskôr vytvorený z triedy, zvyčajne pomocou kľúčového slova Nový. Potom objekt žije svoj život a poskytuje nám prístup k svojim metódam a poliam.

Nakoniec, keď už to nie je potrebné, smetiar ho zničí.

11. Ďalšie metódy vytvárania objektov

V tejto časti sa pozrieme na zopár krát iné metódy ako Nový kľúčové slovo na vytvorenie objektov a spôsob ich použitia, najmä reflexie, klonovania a serializácie.

Reflexia je mechanizmus, ktorý môžeme použiť na kontrolu tried, polí a metód za behu. Tu je príklad vytvorenia našej Používateľ objekt pomocou odrazu:

@Test public void whenInitializedWithReflection_thenInstanceIsNotNull () vyvolá výnimku {User user = User.class.getConstructor (String.class, int.class) .newInstance ("Alice", 2); assertThat (užívateľ) .isNotNull (); }

V tomto prípade používame odraz na nájdenie a vyvolanie konštruktora Používateľ trieda.

Ďalšia metóda, klonovanie je spôsob, ako vytvoriť presnú kópiu objektu. Za toto naše Používateľ trieda musí implementovať Cloneable rozhranie:

verejná trieda Používateľ implementuje Cloneable {// ...}

Teraz môžeme použiť klon () metóda na vytvorenie nového clonedUser objekt, ktorý má rovnaké hodnoty vlastností ako používateľ objekt:

@ Test public void whenCopiedWithClone_thenExactMatchIsCreated () vyvolá CloneNotSupportedException {User user = new User ("Alice", 3); Používateľ clonedUser = (Používateľ) user.clone (); assertThat (clonedUser) .isEqualTo (užívateľ); }

Môžeme tiež použiť slnko.misc.nebezpečný trieda na pridelenie pamäte pre objekt bez volania konštruktora:

Používateľ u = (Používateľ) unsafeInstance.allocateInstance (User.class);

12. Záver

V tomto tutoriáli sme sa venovali inicializácii polí v Jave. Objavili sme rôzne dátové typy v Jave a spôsoby ich použitia. Podrobne sme sa zaoberali aj niekoľkými spôsobmi vytvárania objektov v prostredí Java.

Celú implementáciu tohto tutoriálu nájdete na Github.


$config[zx-auto] not found$config[zx-overlay] not found