Kuten tiedät, luokka tarjoaa objektien suunnitelman; luot objektin luokasta. Jokainen seuraavista CreateObjectDemo
-ohjelmasta otetuista lauseista luo objektin ja määrittää sen muuttujalle:
Ensimmäinen rivi luo objektin Point
-luokka, ja toinen ja kolmas rivi luovat kukin Rectangle
-luokan objektin.
Jokaisella näistä lauseista on kolme osaa (käsitellään yksityiskohtaisesti jäljempänä):
- Ilmoitus: Lihavoidut koodit ovat kaikki muuttujailmoituksia, jotka yhdistävät muuttujan nimen objektityyppiin.
- Instantiation: Uusi avainsana on Java-operaattori, joka luo objektin.
- Alustus: Uutta operaattoria seuraa kutsu konstruktorille, joka alustaa uuden objektin.
Muuttujan julistaminen viitata objektiin
Aiemmin opit, että muuttujan ilmoittamiseksi kirjoitat:
type name;
Tämä ilmoittaa kääntäjälle, että käytät nimeä viitataksesi tietoihin, joiden tyyppi on tyyppi. Primitiivisellä muuttujalla tämä ilmoitus varaa myös muuttujalle oikean määrän muistia.
Voit myös ilmoittaa viitemuuttujan omalle rivilleen. Esimerkiksi:
Point originOne;
Jos ilmoitat originOne
näin, sen arvo olla määrittelemätön, kunnes objekti on todella luotu ja osoitettu sille. Yksinkertaisesti viitemuuttujan ilmoittaminen ei luo objektia. Tätä varten sinun on käytettävä new
-operaattoria seuraavassa osassa kuvatulla tavalla. Sinun on määritettävä objekti osoitteeseen originOne
, ennen kuin käytät sitä koodissasi. Muussa tapauksessa saat kääntäjävirheen.
Tässä tilassa oleva muuttuja, joka ei tällä hetkellä viittaa mihinkään objektiin, voidaan kuvata seuraavasti (muuttujan nimi, originOne
ja mihinkään viittaava viittaus):
Luokan välitön käynnistys
Uusi operaattori havainnollistaa luokan varaamalla muistia uudelle objektille ja palauttamalla viitteen kyseiseen muistiin. Uusi operaattori kutsuu myös objektinrakentajan.
Uusi operaattori vaatii yhden postfix-argumentin: kutsun rakentajalle. Konstruktorin nimi antaa luokan nimen, joka tulee ilmentää.
Uusi operaattori palauttaa viitteen luomaansa objektiin. Tämä viite on yleensä määritetty sopivan tyyppiselle muuttujalle, kuten:
Uuden operaattorin palauttama viite ei on määritettävä muuttujalle. Sitä voidaan käyttää myös suoraan lausekkeessa. Esimerkiksi:
int height = new Rectangle().height;
Tätä lausuntoa käsitellään seuraavassa osiossa.
Objektin alustaminen
Tässä on Point-luokan koodi:
public class Point { public int x = 0; public int y = 0; //constructor public Point(int a, int b) { x = a; y = b; }}
Tämä luokka sisältää yhden konstruktorin. Voit tunnistaa konstruktorin, koska sen käsky käyttää samaa nimeä kuin luokka ja sillä ei ole palautustyyppiä. Point-luokan rakentaja vie kaksi kokonaislukua, kuten koodi on ilmoittanut (int a, int b). Seuraava lause antaa arvot 23 ja 94 kyseisille argumenteille:
Point originOne = new Point(23, 94);
Tämän suorituksen tulos lause voidaan havainnollistaa seuraavassa kuvassa:
Tässä on Suorakulmio-luokan koodi, joka sisältää neljä konstruktoria:
Jokaisen konstruktorin avulla voit antaa alkuarvot suorakulmion alkuperälle, leveydelle ja korkeudelle sekä primitiivisillä että viitetyypeillä. Jos luokassa on useita rakentajia, niillä on oltava erilaiset allekirjoitukset. Java-kääntäjä erottaa t hän rakentaa argumenttien lukumäärän ja tyypin perusteella. Kun Java-kääntäjä kohtaa seuraavan koodin, se tietää kutsuvan Suorakulmio-luokan konstruktorin, joka vaatii Point-argumentin, jota seuraa kaksi kokonaislukua:
Rectangle rectOne = new Rectangle(originOne, 100, 200);
Tämä kutsuu yhtä Rectangle
”konstruktoreista, joka alustaa origin
muotoon originOne
Konstruktori asettaa myös width
arvoksi 100 ja height
arvoksi 200.Nyt on kaksi viittausta samaan Point-objektiin – objektilla voi olla useita viittauksia siihen, kuten seuraavassa kuvassa näkyy:
Seuraava koodirivi kutsuu Rectangle
-rakentajaa, joka vaatii kaksi kokonaislukuargumenttia, jotka antavat alkukoodin leveyden ja korkeuden arvot. Jos tarkastat koodin konstruktorissa, huomaat, että se luo uuden Point-objektin, jonka x- ja y-arvot alustetaan arvoon 0:
Rectangle rectTwo = new Rectangle(50, 100);
Seuraavassa lauseessa käytetty suorakaiteen muotoilija ei ota argumentteja, joten sitä kutsutaan argumenttittomaksi konstruktoriksi:
Rectangle rect = new Rectangle();
Kaikilla luokilla on vähintään yksi konstruktori. Jos luokka ei nimenomaisesti ilmoita mitään, Java-kääntäjä antaa automaattisesti argumenttittoman konstruktorin, jota kutsutaan oletuskonstruktoriksi. Tämä oletusrakentaja kutsuu luokan vanhemman argumenttirakentajan tai Object
-rakentajan, jos luokassa ei ole muuta vanhempaa. Jos vanhemmalla ei ole konstruktoria (Object
on sellainen), kääntäjä hylkää ohjelman.