Ohjelmointi

Rakentajien ymmärtäminen

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, staattinentai 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

AiheRakentajatMenetelmät
TarkoitusLuo luokan esiintymäRyhmittele Java-lauseet
MuuttajatEi voi olla abstrakti, lopullinen, syntyperäinen, staattinentai synkronoituVoi olla abstrakti, lopullinen, syntyperäinen, staattinentai synkronoitu
PalautustyyppiEi palautustyyppiä, ei edes mitätönmitätön tai kelvollinen palautustyyppi
NimiSama nimi kuin luokassa (ensimmäinen kirjain isot kirjaimet on sovittu) - yleensä substantiiviMikä 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 riviViittaa omistavan luokan esiintymään. Ei voida käyttää staattisilla menetelmillä
superKutsuu yläluokan rakentajan. Jos sitä käytetään, sen on oltava rakentajan ensimmäinen riviKutsuu vanhemman luokan ohitetun menetelmän
PerintöRakentajia ei peritäMenetelmät ovat perittyjä
Kääntäjä toimittaa automaattisesti oletusrakentajanJos luokassa ei ole konstruktoria, argumenttirakentaja toimitetaan automaattisestiEi päde
Kääntäjä toimittaa oletuskutsun automaattisesti yläluokan rakentajalleJos konstruktori ei tee nolla- tai enemmän argumenttikutsuja super, ei-argumentti kutsu super on tehtyEi päde
Robert Nielsen on Sunin sertifioima Java 2 -ohjelmoija. Hänellä on koulutuksen maisterin tutkinto, joka on erikoistunut tietokoneavusteiseen opetukseen, ja hän on opettanut tietotekniikan alalla useita vuosia. Hän on myös julkaissut tietokoneisiin liittyviä artikkeleita useissa lehdissä.

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.

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