Vodič za stvaranje objekata u Javi

1. Pregled

Jednostavno rečeno, prije nego što možemo raditi s objektom na JVM-u, on se mora inicijalizirati.

U sljedećim ćemo odjeljcima pogledati razne načine na koje možemo inicijalizirati primitivne tipove i objekte.

2. Izjava naspram inicijalizacije

Krenimo od toga da budemo sigurni da smo na istoj stranici.

Izjava je postupak definiranja varijable zajedno s vrstom i nazivom.

Evo, proglašavamo iskaznica varijabla:

int id;

S druge strane, inicijalizacija se odnosi na dodjeljivanje vrijednosti; na primjer:

id = 1;

Za demonstraciju ćemo stvoriti Korisnik razred s a Ime i iskaznica Svojstva:

korisnik javne klase {naziv privatnog niza; privatni int id; // standardni konstruktor, getteri, postavljači,}

Dalje, vidjet ćemo da inicijalizacija djeluje drugačije, ovisno o vrsti polja koje inicijaliziramo.

3. Objekti protiv primitiva

Java pruža dvije vrste predstavljanja podataka: primitivne vrste i referentne vrste. U ovom ćemo odjeljku razgovarati o razlikama između njih dvoje u pogledu inicijalizacije.

Java ima osam ugrađenih vrsta podataka, koje se nazivaju Java primitivnim tipovima; varijable ovog tipa izravno drže svoje vrijednosti.

Tipovi referenci sadrže reference na objekte (primjerke klasa). Za razliku od primitivnih tipova koji svoje vrijednosti drže u memoriji u kojoj je varijabla dodijeljena, reference ne sadrže vrijednost objekta na koji se odnose.

Umjesto toga, referenca upućuje na objekt spremanjem memorijske adrese na kojoj se objekt nalazi.

Imajte na umu da nam Java ne dopušta da otkrijemo koja je fizička adresa memorije. Umjesto toga, referencu možemo koristiti samo za upućivanje na objekt.

Pogledajmo primjer koji deklarira i inicijalizira referentni tip iz našeg Korisnik razred:

@Test public void whenIntializedWithNew_thenInstanceIsNotNull () {Korisnik korisnik = novi korisnik (); assertThat (korisnik) .isNotNull (); }

Kao što ovdje možemo vidjeti, referenca se novom može dodijeliti pomoću ključne riječi novi, koja je odgovorna za stvaranje novog Korisnik objekt.

Nastavimo s učenjem više o stvaranju predmeta.

5. Stvaranje objekata

Za razliku od primitiva, stvaranje objekata je malo složenije. To je zato što ne dodajemo samo vrijednost polju; umjesto toga pokrećemo inicijalizaciju pomoću novi ključna riječ. To zauzvrat poziva konstruktor i inicijalizira objekt u memoriji.

Razgovarajmo o konstruktorima i novi detaljnije ključne riječi.

The novi ključna riječ je odgovoran za dodjelu memorije za novi objekt putem konstruktora.

Konstruktor se obično koristi za inicijalizaciju varijabli instance koje predstavljaju glavna svojstva stvorenog objekta.

Ako konstruktor ne dostavimo eksplicitno, kompajler će stvoriti zadani konstruktor koji nema argumente i samo dodjeljuje memoriju za objekt.

Klasa može imati mnogo konstruktora sve dok su njihovi popisi parametara različiti (preopterećenje). Svaki konstruktor koji ne pozove drugi konstruktor u istoj klasi ima poziv svom nadređenom konstruktoru bez obzira je li ga izričito napisao ili ubacio kompajler super().

Dodajmo konstruktor u naš Korisnik razred:

javni korisnik (ime niza, int id) {this.name = name; this.id = id; }

Sada možemo koristiti naš konstruktor za stvaranje a Korisnik objekt s početnim vrijednostima za svoja svojstva:

Korisnik korisnik = novi korisnik ("Alice", 1);

6. Promjenjivi opseg

U sljedećim ćemo odjeljcima pogledati različite vrste opsega u kojima varijabla u Javi može postojati i kako to utječe na postupak inicijalizacije.

6.1. Promjenjive instance i klase

Varijable instance i klase ne zahtijevaju da ih inicijaliziramo. Čim deklariramo ove varijable, one dobivaju zadanu vrijednost kako slijedi:

Pokušajmo sada definirati neke varijable povezane s instancom i klasom i testirati imaju li zadanu vrijednost ili ne:

@Test public void whenValuesAreNotInitialized_thenUserNameAndIdReturnDefault () {Korisnik korisnik = novi korisnik (); assertThat (user.getName ()). isNull (); assertThat (user.getId () == 0); }

6.2. Lokalne varijable

Lokalne varijable moraju se inicijalizirati prije upotrebe, jer nemaju zadanu vrijednost, a prevoditelj nam ne dopušta da koristimo neinicijaliziranu vrijednost.

Na primjer, sljedeći kod generira pogrešku kompajlera:

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

7. The Konačno Ključna riječ

The konačni Ključna riječ primijenjena na polje znači da se vrijednost polja više ne može mijenjati nakon inicijalizacije. Na taj način možemo definirati konstante u Javi.

Dodajmo konstantu na naš Korisnik razred:

privatni statički konačni int GODINA = 2000;

Konstante se moraju inicijalizirati bilo kad su deklarirane ili u konstruktoru.

8. Inicijalizatori u Javi

U Javi je an inicijalizator je blok koda koji nema povezano ime ili tip podataka i postavlja se izvan bilo koje metode, konstruktora ili drugog bloka koda.

Java nudi dvije vrste inicijalizatora, statički i instance inicijalizatora. Pogledajmo kako možemo koristiti svaki od njih.

8.1. Inicijalizatori instance

Pomoću njih možemo inicijalizirati varijable instance.

Da bismo demonstrirali, pružimo vrijednost za korisnika iskaznica koristeći inicijalizator instance u našem Korisnik razred:

{id = 0; }

8.2. Blok statičke inicijalizacije

Statički inicijalizator ili statički blok - je blok koda koji se koristi za inicijalizaciju statički polja. Drugim riječima, to je jednostavan inicijalizator označen ključnom riječi statički:

privatni statični forum s nizovima; statički {forum = "Java"; }

9. Redoslijed inicijalizacije

Pri pisanju koda koji inicijalizira različite vrste polja, naravno, moramo pripaziti na redoslijed inicijalizacije.

U Javi je redoslijed inicijalizacijskih naredbi sljedeći:

  • statičke varijable i statički inicijalizatori redom
  • varijable instance i redoslijed inicijalizatora instance
  • konstruktori

10. Životni ciklus objekta

Sad kad smo naučili kako deklarirati i inicijalizirati objekte, otkrijmo što se događa s objektima kad nisu u upotrebi.

Za razliku od ostalih jezika u kojima se moramo brinuti zbog uništenja predmeta, Java se brine o zastarjelim objektima putem svog sakupljača smeća.

Svi objekti u Javi pohranjeni su u hrpi memorije našeg programa. Zapravo, gomila predstavlja velik skup neiskorištene memorije, dodijeljen našoj Java aplikaciji.

S druge strane, sakupljač smeća je Java program koji se brine o automatskom upravljanju memorijom brisanjem objekata koji više nisu dostupni.

Da bi Java objekt postao nedostižan, mora naići na jednu od sljedećih situacija:

  • Objekt više nema reference na njega
  • Sve reference koje upućuju na objekt izvan su opsega

Zaključno, objekt se prvo kreira iz klase, obično koristeći ključnu riječ novi. Tada objekt živi svoj život i pruža nam pristup svojim metodama i poljima.

Konačno, kada više nije potreban, sakupljač smeća ga uništava.

11. Ostale metode za stvaranje predmeta

U ovom ćemo odjeljku ukratko pogledati metode osim novi ključna riječ za stvaranje predmeta i kako ih primijeniti, posebno odraz, kloniranje i serializacija.

Refleksija je mehanizam koji možemo koristiti za inspekciju klasa, polja i metoda u vrijeme izvođenja. Evo primjera stvaranja našeg Korisnik objekt pomoću refleksije:

@Test public void whenInitializedWithReflection_thenInstanceIsNotNull () baca iznimku {User user = User.class.getConstructor (String.class, int.class) .newInstance ("Alice", 2); assertThat (korisnik) .isNotNull (); }

U ovom slučaju koristimo refleksiju za pronalaženje i pozivanje konstruktora Korisnik razred.

Sljedeća metoda, kloniranje, način je za stvaranje točne kopije objekta. Za ovo, naše Korisnik klasa mora implementirati Klonirajući sučelje:

javna klasa Korisnik implementira Cloneable {// ...}

Sada možemo koristiti klon() metoda za stvaranje nove clonedUser objekt koji ima iste vrijednosti svojstava kao i korisnik objekt:

@Test public void whenCopiedWithClone_thenExactMatchIsCreated () baca CloneNotSupportedException {User user = new User ("Alice", 3); Korisnik clonedUser = (Korisnik) user.clone (); assertThat (clonedUser) .isEqualTo (korisnik); }

Također možemo koristiti sunce.misc.Nesigurno klase za dodjelu memorije za objekt bez pozivanja konstruktora:

Korisnik u = (Korisnik) unsafeInstance.allocateInstance (User.class);

12. Zaključak

U ovom smo tutorijalu obradili inicijalizaciju polja u Javi. Otkrili smo različite tipove podataka u Javi i kako ih koristiti. Također smo detaljno proučili nekoliko načina stvaranja objekata u Javi.

Potpuna implementacija ovog vodiča može se naći na Githubu.