Programiranje

Razumevanje konstruktorjev

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

TemaKonstruktorjiMetode
NamenUstvarite primerek razredaIzjavi Java stavke
ModifikatorjiNe more biti povzetek, dokončno, domač, statično, ali sinhroniziranoJe lahko povzetek, dokončno, domač, statično, ali sinhronizirano
VrnitevBrez vrnitve, niti ne prazninopraznino ali veljaven tip vrnitve
ImeIsto ime kot razred (prva črka je napisana z veliko začetnico) - običajno samostalnikKatero koli ime razen razreda. Imena metod se po dogovoru začnejo z malo črko - običajno z imenom dejanja
toNanaša se na drug konstruktor v istem razredu. Če se uporablja, mora biti prva vrstica konstruktorjaNanaša se na primerek razreda lastništva. Statičnih metod ni mogoče uporabiti
superPokliče konstruktor nadrejenega razreda. Če se uporablja, mora biti prva vrstica konstruktorjaPokliče nadomeščeno metodo v nadrejenem razredu
DedovanjeKonstruktorji niso podedovaniMetode so podedovane
Prevajalnik samodejno dobavi privzeti konstruktorČe razred nima konstruktorja, se samodejno predloži konstruktor brez argumentovSe ne uporablja
Prevajalnik samodejno pošlje privzeti klic konstruktorju superklaseČe konstruktor ne izvede nobenega ali več argumentov super, klic brez argumenta super je narejenSe ne uporablja
Robert Nielsen je Sun Certified Java 2 programer. Je magister izobrazbe, specializiran za računalniško podprto poučevanje in že nekaj let poučuje na računalniškem področju. V različnih revijah je objavljal tudi članke, povezane z računalnikom.

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.

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