Reči, da je konstruktor metoda, je kot reči, da je avstralski platipus le še en sesalec. Za razumevanje platipa je pomembno vedeti, kako se razlikuje od drugih sesalcev. Za razumevanje konstruktorja je prav tako pomembno razumeti, kako se razlikuje od metode. Vsak študent Jave, zlasti tisti, ki se izobražuje za certifikacijo, mora poznati te razlike; v tem članku jih bom konkretno zapisal. Tabela 1 na koncu tega članka povzema ključne razlike med konstruktorjem in metodo.
Namen in delovanje
Konstruktorji imajo en namen v življenju: ustvariti primerek razreda. Temu lahko rečemo tudi ustvarjanje predmeta, kot v:
Platypus p1 = nov Platypus ();
Namen metod pa je nasprotno veliko bolj splošen. Osnovna funkcija metode je izvajanje kode Java.
Razlike v podpisih
Konstruktorji in metode se razlikujejo v treh vidikih podpisa: modifikatorji, vrsta vrnitve in ime. Tako kot metode imajo lahko tudi konstruktorji katerega koli od modifikatorjev dostopa: javni, zaščiteni, zasebni ali nobenega (pogosto imenovanega paket ali prijazno). Za razliko od metod lahko konstruktorji uporabljajo samo modifikatorje dostopa. Zato konstruktorji ne morejo biti povzetek
, dokončno
, domač
, statično
, ali sinhronizirano
.
Tudi vrste vračila so zelo različne. Metode imajo lahko katero koli veljavno vrsto vrnitve ali nobeno vrnitev, v tem primeru je vrsta vrnitve podana kot praznino
. Konstruktorji nimajo niti vrste vrnitve, niti praznino
.
Na koncu imajo metode in konstruktorji različna imena glede podpisa. Konstruktorji imajo enako ime kot njihov razred; po dogovoru metode uporabljajo imena, ki niso imena razreda. Če program Java sledi običajnim konvencijam, se metode začnejo z malo črko, konstruktorji z veliko črko. Tudi imena konstruktorjev so navadno samostalniki, ker so imena razredov navadno samostalniki; Imena metod običajno označujejo dejanja.
Uporaba "tega"
Konstruktorji in metode uporabljajo ključno besedo to
povsem drugače. Metoda uporablja to
da se sklicuje na primerek razreda, ki izvaja metodo. Statične metode se ne uporabljajo to
; ne pripadajo primerku razreda, torej to
ne bi imel ničesar za sklicevanje. Statične metode pripadajo razredu kot celoti, ne pa primerku. Konstruktorji uporabljajo to
za sklicevanje na drug konstruktor v istem razredu z drugačnim seznamom parametrov. Preučite naslednjo kodo:
javni razred Platypus {Ime niza; Platypus (String input) {ime = vnos; } Platypus () {this ("John / Mary Doe"); } public static void main (String args []) {Platypus p1 = new Platypus ("digger"); Platypus p2 = nov Platypus (); }}
V kodi sta dva konstruktorja. Prvi traja Vrvica
vnos za poimenovanje primerka. Drugi, brez parametrov, pokliče prvega konstruktorja s privzetim imenom "John / Mary Doe"
.
Če konstruktor uporablja to
, mora biti v prvi vrstici konstruktorja; če prezrete to pravilo, bo prevajalnik ugovarjal.
Uporaba "super"
Uporabljajo se metode in konstruktorji super
sklicevati se na superrazred, vendar na različne načine. Uporaba metod super
za izvedbo razveljavljene metode v superrazredu, kot ponazarja naslednji primer:
razred Sesalci {void getBirthInfo () {System.out.println ("rojen živ."); }} razred Platypus razširja sesalce {void getBirthInfo () {System.out.println ("izleži iz jajčec"); System.out.print ("sesalec običajno je"); super.getBirthInfo (); }}
V zgornjem programu je klic super.getBirthInfo ()
pokliče nadomeščeno metodo Sesalci
superrazred.
Konstruktorji uporabljajo super
za sklicevanje na konstruktor superklase. Če konstruktor uporablja super
, mora ga uporabiti v prvi vrstici; v nasprotnem primeru se bo prevajalnik pritožil. Sledi primer:
javni razred SuperClassDemo {SuperClassDemo () {}} razred Child razširja SuperClassDemo {Child () {super (); }}
V zgornjem (in nepomembnem!) Primeru konstruktor Otrok ()
vključuje klic na super
, kar povzroči razred SuperClassDemo
za instanco, poleg Otrok
razred.
Koda, ki jo dobi prevajalnik
Novi programer Java se lahko spotakne, ko prevajalnik samodejno dobavi kodo za konstruktorje. To se zgodi, če napišete razred brez konstruktorjev; prevajalnik vam bo samodejno ponudil konstruktor brez argumentov. Če torej napišete:
primer javnega razreda {}
funkcionalno je enakovredno pisanju:
javni razred Primer {Primer () {}}
Prevajalnik samodejno dobavi kodo tudi, ko je ne uporabljate super
(z uporabo nič ali več parametrov) kot prva vrstica konstruktorja. V tem primeru računalnik samodejno vstavi super
. Če torej napišete:
javni razred TestConstructors {TestConstructors () {}}
funkcionalno je enakovredno pisanju:
javni razred TestConstructors {TestConstructors () { super
; } }
Ostrooki začetnik se morda vpraša, kako lahko zgornji program pokliče konstruktor nadrejenega razreda kdaj TestConstructor
ne razširja nobenega razreda. Odgovor je, da Java razširja Predmet
razreda, če razreda eksplicitno ne razširite. Prevajalnik samodejno poda konstruktor brez argumentov, če ni izrecno deklariran noben konstruktor, in samodejno poda argument brez argumenta super
klic, kadar konstruktor nima izrecnega klica super
. Torej sta naslednja dva delčka kode funkcionalno enakovredna:
primer javnega razreda {}
in
javni razred Primer {Primer () { super
; } }
Dedovanje
Kaj je narobe z naslednjim scenarijem? Odvetnik bere oporoko Razred
. Člani Razred
družina je zbrana za veliko konferenčno mizo, nekateri nežno ječejo. Odvetnik prebere: "Jaz, Razred
, ki so zdravega duha in telesa, vse moje konstruktorje prepustite mojim otrokom. "
Težava je v tem, da konstruktorjev ni mogoče podedovati. Na srečo Razred
otroci bodo samodejno podedovali katero koli metodo svojih staršev, zato Razred
otroci ne bodo popolnoma osiromašeni.
Ne pozabite, da so metode Java podedovane, konstruktorji pa ne. Upoštevajte naslednji razred:
primer javnega razreda {public void sayHi {system.out.println ("Hi"); } Primer () {}} javni razred SubClass razširja Primer {}
The Podrazred
razred samodejno podeduje reci zdravo
metoda, najdena v nadrejenem razredu. Vendar konstruktor Primer ()
ne podeduje Podrazred
.
Povzemanje razlik
Tako kot se platipus razlikuje od običajnega sesalca, se tudi konstruktorji razlikujejo od metod; posebej v njihovem namenu, podpisu in uporabi to
in super
. Poleg tega se konstruktorji razlikujejo glede na dedovanje in kodo, ki jo dobi prevajalnik. Ohranjanje vseh teh podrobnosti je lahko težavno delo; Naslednja tabela ponuja priročen povzetek najpomembnejših točk. Več informacij o konstruktorjih in metodah najdete v spodnjem razdelku Viri.
Tabela 1. Razlike med konstruktorji in metodami
Tema | Konstruktorji | Metode |
---|---|---|
Namen | Ustvarite primerek razreda | Izjavi Java stavke |
Modifikatorji | Ne more biti povzetek , dokončno , domač , statično , ali sinhronizirano | Je lahko povzetek , dokončno , domač , statično , ali sinhronizirano |
Vrnitev | Brez vrnitve, niti ne praznino | praznino ali veljaven tip vrnitve |
Ime | Isto ime kot razred (prva črka je napisana z veliko začetnico) - običajno samostalnik | Katero koli ime razen razreda. Imena metod se po dogovoru začnejo z malo črko - običajno z imenom dejanja |
to | Nanaša se na drug konstruktor v istem razredu. Če se uporablja, mora biti prva vrstica konstruktorja | Nanaša se na primerek razreda lastništva. Statičnih metod ni mogoče uporabiti |
super | Pokliče konstruktor nadrejenega razreda. Če se uporablja, mora biti prva vrstica konstruktorja | Pokliče nadomeščeno metodo v nadrejenem razredu |
Dedovanje | Konstruktorji niso podedovani | Metode so podedovane |
Prevajalnik samodejno dobavi privzeti konstruktor | Če razred nima konstruktorja, se samodejno predloži konstruktor brez argumentov | Se ne uporablja |
Prevajalnik samodejno pošlje privzeti klic konstruktorju superklase | Če konstruktor ne izvede nobenega ali več argumentov super , klic brez argumenta super je narejen | Se ne uporablja |
Preberite več o tej temi
- Nekatere knjige, ki zajemajo osnove konstruktorjev in metod, so
- Popoln vodnik za certificiranje študije Java 2, Simon Roberts idr. (Sybex, 2000) //www.amazon.com/exec/obidos/ASIN/0782128254/qid=969399182/sr=1-2/102-9220485-9634548
- Java 2 (izpit), Bill Brogden (Skupina Coriolis, 1999):
//www.amazon.com/exec/obidos/ASIN/1576102912/qid%3D969399279/102-9220485-9634548
- Java na kratko, Davis Flanagan (O'Reilly & Associates, 1999) // www.amazon.com/exec/obidos/ASIN/1565924878/o/qid=969399378/sr=2-1/102-9220485-9634548
- Za več informacij o metodah in konstruktorjih obiščite spletno mesto Sun Microsystems
//java.sun.com/docs/books/tutorial/trailmap.html
- Za več vsebine Java za začetnike preberite JavaWorld 'novo Java 101 serija stolpcev
//www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html
To zgodbo "Razumevanje konstruktorjev" je prvotno objavil JavaWorld.