Sanominen, että konstruktori on menetelmä, on kuin sanoa, että Australian platypus on vain yksi nisäkäs. Platypusin ymmärtämiseksi on tärkeää tietää, miten se eroaa muista nisäkkäistä. Rakentajan ymmärtämiseksi on yhtä tärkeää ymmärtää, miten se eroaa menetelmästä. Jokaisen Java-opiskelijan, varsinkin sellaisen, joka opiskelee sertifiointia varten, on tunnettava nämä erot; tässä artikkelissa aion konkretisoida ne. Tämän artikkelin lopussa olevassa taulukossa 1 on yhteenveto tärkeimmistä rakentajan ja menetelmän eroista.
Tarkoitus ja toiminta
Rakentajilla on yksi elämän tarkoitus: luoda luokan esiintymä. Tätä voidaan kutsua myös objektin luomiseksi, kuten:
Platypus p1 = uusi platypus ();
Menetelmien tarkoitus sitä vastoin on paljon yleisempi. Menetelmän perustoiminto on Java-koodin suorittaminen.
Allekirjoituserot
Rakentajat ja menetelmät eroavat allekirjoituksen kolmesta näkökulmasta: muokkaajat, palautustyyppi ja nimi. Kuten menetelmillä, rakentajilla voi olla mikä tahansa pääsynmuokkaajasta: julkinen, suojattu, yksityinen tai ei mitään (usein kutsutaan paketti tai ystävällinen). Toisin kuin menetelmissä, rakentajat voivat ottaa käyttöön vain pääsynmuokkaajia. Siksi rakentajat eivät voi olla abstrakti
, lopullinen
, syntyperäinen
, staattinen
tai synkronoitu
.
Palautustyypit ovat myös hyvin erilaisia. Menetelmillä voi olla mikä tahansa kelvollinen palautustyyppi tai ei palautustyyppiä, jolloin palautustyyppi annetaan muodossa mitätön
. Rakentajilla ei ole palautustyyppiä, ei edes mitätön
.
Lopuksi, mitä tulee allekirjoitukseen, menetelmillä ja konstruktoreilla on eri nimet. Rakentajilla on sama nimi kuin luokassaan; sopimusten mukaan menetelmissä käytetään muita nimiä kuin luokan nimi. Jos Java-ohjelma noudattaa tavanomaisia käytäntöjä, menetelmät alkavat pienellä kirjaimella, rakentajat isolla kirjaimella. Myös konstruktorien nimet ovat yleensä substantiiveja, koska luokkien nimet ovat yleensä substantiiveja; menetelmän nimet osoittavat yleensä toimintoja.
"Tämän" käyttö
Rakentajat ja menetelmät käyttävät avainsanaa Tämä
aivan eri tavalla. Menetelmä käyttää Tämä
viitata menetelmän suorittavan luokan ilmentymään. Staattisia menetelmiä ei käytetä Tämä
; ne eivät kuulu luokkainstanssiin, joten Tämä
ei ole mitään viittaavaa. Staattiset menetelmät kuuluvat koko luokkaan eikä instanssiin. Rakentajat käyttävät Tämä
viitata toiseen saman luokan konstruktoriin, jolla on erilainen parametriluettelo. Tutki seuraavaa koodia:
julkinen luokka Platypus {Merkkijonon nimi; Platypus (merkkijono) {name = input; } Platypus () {tämä ("John / Mary Doe"); } public static void main (String args []) {Platypus p1 = uusi platypus ("kaivuri"); Platypus p2 = uusi platypus (); }}
Koodissa on kaksi rakentajaa. Ensimmäinen kestää a Merkkijono
nimi instanssin nimeämiseksi. Toinen, ilman parametreja, kutsuu ensimmäistä konstruktoria oletusnimellä "John / Mary Doe"
.
Jos rakentaja käyttää Tämä
, sen on oltava rakentajan ensimmäisellä rivillä; Tämän säännön huomiotta jättäminen kääntäjää vastustaa.
"Super": n käyttö
Sekä menetelmät että rakentajat käyttävät super
viitata superluokkaan, mutta eri tavoin. Menetelmien käyttö super
suorittaa ohitettu menetelmä superluokassa, kuten seuraava esimerkki kuvaa:
luokka Nisäkäs {void getBirthInfo () {System.out.println ("syntynyt elossa"); }} luokka Platypus laajentaa nisäkäs {void getBirthInfo () {System.out.println ("luukku munista"); System.out.print ("nisäkäs normaalisti on"); super.getBirthInfo (); }}
Yllä olevassa ohjelmassa kutsu super.getBirthInfo ()
kutsuu ohitetun menetelmän Nisäkäs
superluokka.
Rakentajat käyttävät super
vedota superluokan rakentajaan. Jos rakentaja käyttää super
, sen on käytettävä sitä ensimmäisellä rivillä; muuten kääntäjä valittaa. Seuraava esimerkki:
public class SuperClassDemo {SuperClassDemo () {}} -luokka Child laajentaa SuperClassDemo {Child () {super (); }}
Yllä olevassa (ja triviaalissa!) Esimerkissä konstruktori Lapsi()
sisältää puhelun super
, joka aiheuttaa luokan SuperClassDemo
on instantioitava lisäksi Lapsi
luokassa.
Kääntäjän toimittama koodi
Uusi Java-ohjelmoija voi kompastua, kun kääntäjä toimittaa koodin automaattisesti rakentajille. Näin tapahtuu, jos kirjoitat luokan ilman rakentajia; kääntäjä toimittaa sinulle automaattisesti argumenttittoman konstruktorin. Jos siis kirjoitat:
julkisen luokan esimerkki {}
se vastaa toiminnallisesti kirjoittamista:
julkisen luokan esimerkki {Esimerkki () {}}
Kääntäjä toimittaa koodin myös automaattisesti, kun et käytä sitä super
(käyttäen nollaa tai useampaa parametria) konstruktorin ensimmäisenä rivinä. Tässä tapauksessa tietokone lisää automaattisesti super
. Jos siis kirjoitat:
julkinen luokka TestConstructors {TestConstructors () {}}
se vastaa toiminnallisesti kirjoittamista:
julkinen luokka TestConstructors {TestConstructors () { super
; } }
Terävän silmän aloittelija voi miettiä, kuinka yllä oleva ohjelma voi soittaa vanhempaluokan rakentajalle milloin TestConstructor
ei laajenna luokkaa. Vastaus on, että Java laajentaa Esine
luokka, kun et nimenomaisesti jatka luokkaa. Kääntäjä toimittaa automaattisesti argumenttittoman konstruktorin, jos yksikään konstruktori ei ole nimenomaisesti ilmoitettu, ja toimittaa automaattisesti ei-argumentin super
kutsu, kun rakentajalla ei ole nimenomaista kutsua super
. Joten seuraavat kaksi koodinpätkää ovat toiminnallisesti vastaavia:
julkisen luokan esimerkki {}
ja
julkisen luokan esimerkki {Esimerkki () { super
; } }
Perintö
Mikä on väärässä seuraavassa skenaariossa? Asianajaja lukee Luokka
. Jäsenet Luokka
perhe on koottu suuren neuvottelupöydän ympärille, jotkut huutavat lempeästi. Lakimies lukee: "Minä, Luokka
, joka on terve mieli ja ruumis, jätä kaikki rakentajani lapsilleni. "
Ongelmana on, että rakentajia ei voida periä. Onneksi Luokka
lapset, he perivät automaattisesti minkä tahansa vanhempiensa menetelmän, joten Luokka
lapset eivät tule täysin köyhiksi.
Muista, että Java-menetelmät ovat perittyjä, rakentajat eivät. Harkitse seuraavaa luokkaa:
julkinen luokka Esimerkki {public void sayHi {system.out.println ("Hei"); } Esimerkki () {}} julkisen luokan aliluokka laajentaa esimerkkiä {}
Alaluokka
luokka perii automaattisesti sano terveisiä
menetelmä löytyy vanhempien luokassa. Rakentaja kuitenkin Esimerkki ()
ei ole peritty Alaluokka
.
Yhteenveto eroista
Aivan kuten platypus eroaa tyypillisestä nisäkkäästä, niin myös konstruktorit eroavat menetelmistä; erityisesti niiden tarkoituksessa, allekirjoituksessa ja käytössä Tämä
ja super
. Rakentajat eroavat lisäksi perinnöstä ja kääntäjän toimittamasta koodista. Kaikkien näiden yksityiskohtien pitäminen suorana voi olla työlästä; Seuraavassa taulukossa on kätevä yhteenveto tärkeimmistä kohdista. Löydät lisätietoja rakentajista ja menetelmistä alla olevasta Resurssit-osiosta.
Taulukko 1. Rakentajien ja menetelmien erot
Aihe | Rakentajat | Menetelmät |
---|---|---|
Tarkoitus | Luo luokan esiintymä | Ryhmittele Java-lauseet |
Muuttajat | Ei voi olla abstrakti , lopullinen , syntyperäinen , staattinen tai synkronoitu | Voi olla abstrakti , lopullinen , syntyperäinen , staattinen tai synkronoitu |
Palautustyyppi | Ei palautustyyppiä, ei edes mitätön | mitätön tai kelvollinen palautustyyppi |
Nimi | Sama nimi kuin luokassa (ensimmäinen kirjain isot kirjaimet on sovittu) - yleensä substantiivi | Mikä tahansa nimi paitsi luokka. Menetelmien nimet alkavat pienillä kirjaimilla sopimuksen mukaan - yleensä toiminnon nimi |
Tämä | Viittaa toiseen saman luokan rakentajaan. Jos sitä käytetään, sen on oltava rakentajan ensimmäinen rivi | Viittaa omistavan luokan esiintymään. Ei voida käyttää staattisilla menetelmillä |
super | Kutsuu yläluokan rakentajan. Jos sitä käytetään, sen on oltava rakentajan ensimmäinen rivi | Kutsuu vanhemman luokan ohitetun menetelmän |
Perintö | Rakentajia ei peritä | Menetelmät ovat perittyjä |
Kääntäjä toimittaa automaattisesti oletusrakentajan | Jos luokassa ei ole konstruktoria, argumenttirakentaja toimitetaan automaattisesti | Ei päde |
Kääntäjä toimittaa oletuskutsun automaattisesti yläluokan rakentajalle | Jos konstruktori ei tee nolla- tai enemmän argumenttikutsuja super , ei-argumentti kutsu super on tehty | Ei päde |
Lisätietoja tästä aiheesta
- Jotkut kirjat, jotka kattavat rakentajien ja menetelmien perusteet, ovat
- Java 2 Study -sertifioinnin täydellinen opas, Simon Roberts et ai. (Sybex, 2000) //www.amazon.com/exec/obidos/ASIN/0782128254/qid=969399182/sr=1-2/102-9220485-9634548
- Java 2 (tentti Cram), Bill Brogden (The Coriolis Group, 1999):
//www.amazon.com/exec/obidos/ASIN/1576102912/qid%3D969399279/102-9220485-9634548
- Java pähkinänkuoressa, Davis Flanagan (O'Reilly & Associates, 1999) // www.amazon.com/exec/obidos/ASIN/1565924878/o/qid=969399378/sr=2-1/102-9220485-9634548
- Käy Sun Microsystems -verkkosivustolla saadaksesi lisätietoja menetelmistä ja rakentajista
//java.sun.com/docs/books/tutorial/trailmap.html
- Lue lisää Java-sisältöä aloittelijoille lukemalla JavaWorld 's uusi Java 101 sarakesarja
//www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html
Tämän tarinan "Understanding constructors" julkaisi alun perin JavaWorld.