Povedať, že konštruktér je metóda, je ako povedať, že austrálsky ptakopysk je iba ďalším cicavcom. Aby sme pochopili vtákopysk, je dôležité vedieť, v čom sa líši od ostatných cicavcov. Pre pochopenie konštruktora je rovnako dôležité pochopiť, v čom sa líši od metódy. Každý študent Java, najmä ten, ktorý študuje na certifikáciu, musí tieto rozdiely poznať; v tomto článku ich konkrétne vysvetlím. Tabuľka 1 na konci tohto článku sumarizuje kľúčové rozdiely medzi konštruktérmi a metódami.
Účel a funkcia
Konštruktéri majú v živote jediný účel: vytvoriť inštanciu triedy. Toto sa dá nazvať aj vytvorenie objektu, ako napríklad v:
Platypus p1 = nový Platypus ();
Účel metód je naopak oveľa všeobecnejší. Základnou funkciou metódy je vykonávanie kódu Java.
Podpisové rozdiely
Konštruktory a metódy sa líšia v troch aspektoch podpisu: modifikátory, návratový typ a názov. Rovnako ako metódy, môžu mať konštruktory ktorýkoľvek z modifikátorov prístupu: verejný, chránený, súkromný alebo žiadny (často sa volá balíček alebo priateľský). Na rozdiel od metód môžu konštruktory brať iba modifikátory prístupu. Konštruktéri preto nemôžu byť abstraktné
, konečné
, domorodec
, statický
alebo synchronizované
.
Typy návratov sú tiež veľmi odlišné. Metódy môžu mať akýkoľvek platný návratový typ alebo žiadny návratový typ, v takom prípade je návratový typ uvedený ako neplatný
. Konštruktéri nemajú návratový typ, dokonca ani nie neplatný
.
Nakoniec, z hľadiska podpisu majú metódy a konštruktory rôzne názvy. Konštruktéri majú rovnaký názov ako ich trieda; podľa konvencie používajú metódy iné názvy ako názov triedy. Ak program Java dodržiava bežné konvencie, metódy budú začínať malým písmenom, konštruktory veľkým písmenom. Názvy konštruktorov sú zvyčajne tiež podstatné mená, pretože názvy tried sú zvyčajne podstatné mená; názvy metód zvyčajne označujú akcie.
Používanie „tohto“
Konštruktory a metódy používajú kľúčové slovo toto
celkom inak. Metóda používa toto
odkazovať na inštanciu triedy, ktorá vykonáva metódu. Statické metódy sa nepoužívajú toto
; nepatria do inštancie triedy, takže toto
nebude mať na čo odkazovať. Statické metódy patria skôr do triedy ako do inštancie. Konštruktéri používajú toto
odkazovať na iného konštruktora v rovnakej triede s iným zoznamom parametrov. Prečítajte si nasledujúci kód:
verejná trieda Platypus {názov reťazca; Platypus (reťazcový vstup) {name = vstup; } Platypus () {this ("John / Mary Doe"); } public static void main (String args []) {Platypus p1 = nový Platypus ("bager"); Platypus p2 = nový Platypus (); }}
V kóde sú dva konštruktory. Prvý trvá a String
vstup na pomenovanie inštancie. Druhý, ktorý nemá žiadne parametre, zavolá prvého konštruktora podľa predvoleného názvu „John / Mary Doe“
.
Ak použije konštruktér toto
, musí byť v prvom riadku konštruktéra; ignorovanie tohto pravidla spôsobí kompilátor námietku.
Používanie „super“
Metódy aj konštruktory používajú Super
označovať nadtriedu, ale rôznymi spôsobmi. Používané metódy Super
vykonať prepísanú metódu v nadtriede, ako ukazuje nasledujúci príklad:
trieda Cicavec {void getBirthInfo () {System.out.println ("narodený nažive."); }} trieda Platypus rozširuje Mammal {void getBirthInfo () {System.out.println ("poklop z vajec"); System.out.print („cicavec zvyčajne je“); super.getBirthInfo (); }}
Vo vyššie uvedenom programe je volanie na super.getBirthInfo ()
volá prepísanú metódu Cicavec
nadtrieda.
Konštruktéri používajú Super
vyvolať konštruktor nadtriedy. Ak použije konštruktér Super
, musí ho použiť v prvom riadku; inak sa kompilátor sťažuje. Nasleduje príklad:
public class SuperClassDemo {SuperClassDemo () {}} class Child rozširuje SuperClassDemo {Child () {super (); }}
Vo vyššie uvedenom (a triviálnom!) Príklade je to konštruktor Dieťa ()
obsahuje hovor na Super
, ktorá spôsobuje triedu SuperClassDemo
majú byť inštancované, okrem Dieťa
trieda.
Kód dodaný prekladačom
Nový programátor Java môže naraziť, keď kompilátor automaticky dodá kód pre konštruktory. To sa stane, ak napíšete triedu bez konštruktorov; kompilátor za vás automaticky dodá konštruktor bez argumentov. Ak teda napíšete:
verejná trieda Príklad {}
je funkčne ekvivalentný písaniu:
verejná trieda Príklad {Príklad () {}}
Kompilátor tiež automaticky dodáva kód, keď ho nepoužívate Super
(s použitím nuly alebo viacerých parametrov) ako prvý riadok konštruktora. V takom prípade sa počítač automaticky vloží Super
. Ak teda napíšete:
verejná trieda TestConstructors {TestConstructors () {}}
je funkčne ekvivalentný písaniu:
verejná trieda TestConstructors {TestConstructors () { Super
; } }
Ostré oči začiatočník sa môže čudovať, ako môže vyššie uvedený program zavolať konštruktora materskej triedy, keď TestConstructor
nerozširuje žiadnu triedu. Odpoveď je, že Java rozširuje Objekt
triedy, keď triedu výslovne nerozširujete. Kompilátor automaticky dodáva konštruktor bez argumentov, ak nie je výslovne deklarovaný žiadny konštruktor, a automaticky dodáva bez argumentov Super
volanie, keď konštruktor nemá explicitné volanie Super
. Nasledujúce dva útržky kódu sú teda funkčne ekvivalentné:
verejná trieda Príklad {}
a
verejná trieda Príklad {Príklad () { Super
; } }
Dedenie
Čo je zlé v nasledujúcom scenári? Advokát číta závet z Trieda
. Členovia Trieda
rodina sa zhromaždila okolo veľkého konferenčného stola, niektorí jemne vzlykali. Právnik číta: „Ja, Trieda
, pretože mám zdravú myseľ a telo, prenechaj všetkých svojich konštruktérov mojim deťom. “
Problém je v tom, že konštruktory nemožno dediť. Našťastie pre Trieda
deti automaticky zdedia ktorúkoľvek z metód svojich rodičov, takže Trieda
deti sa nestanú úplne opustenými.
Pamätajte, že metódy Java sa dedia, konštruktory nie. Zvážte nasledujúcu triedu:
verejná trieda Príklad {public void sayHi {system.out.println ("Ahoj"); } Príklad () {}} verejná trieda Podtrieda rozširuje príklad {}
The Podtrieda
trieda automaticky dedí povedz ahoj
metóda nájdená v nadradenej triede. Avšak konštruktér Príklad ()
nie je zdedený Podtrieda
.
Zhrnutie rozdielov
Tak ako sa ptakopysk líši od typického cicavca, líšia sa aj konštruktéri od metód; konkrétne na ich účel, podpis a použitie toto
a Super
. Ďalej sa konštruktory líšia vzhľadom na dedičnosť a kód dodaný kompilátorom. Udržiavať všetky tieto detaily rovné môže byť fuška; nasledujúca tabuľka poskytuje pohodlné zhrnutie hlavných bodov. Viac informácií týkajúcich sa konštruktorov a metód nájdete v sekcii Zdroje nižšie.
Tabuľka 1. Rozdiely medzi konštruktérmi a metódami
Téma | Konštruktéri | Metódy |
---|---|---|
Účel | Vytvorte inštanciu triedy | Skupinové príkazy Java |
Modifikátory | Nemôže byť abstraktné , konečné , domorodec , statický alebo synchronizované | Môže byť abstraktné , konečné , domorodec , statický alebo synchronizované |
Typ návratu | Žiadny návratový typ, dokonca ani nie neplatný | neplatný alebo platný typ vrátenia |
názov | Rovnaké meno ako trieda (prvé písmeno je písané veľkými písmenami podľa konvencie) - zvyčajne podstatné meno | Ľubovoľné meno okrem triedy. Názvy metód začínajú podľa konvencie malým písmenom - zvyčajne názvom akcie |
toto | Odkazuje na iného konštruktéra v rovnakej triede. Ak sa použije, musí to byť prvý riadok konštruktora | Odkazuje na inštanciu triedy vlastniacej. Nie je možné použiť statické metódy |
Super | Zavolá konštruktor nadradenej triedy. Ak sa použije, musí to byť prvý riadok konštruktora | Zavolá prepísanú metódu v nadradenej triede |
Dedenie | Konštruktéri sa nededia | Metódy sa dedia |
Kompilátor automaticky dodáva predvolený konštruktor | Ak trieda nemá žiadny konštruktor, automaticky sa dodá konštruktor bez argumentov | Neplatí |
Kompilátor automaticky dodáva predvolené volanie konštruktoru nadtriedy | Ak konštruktor neurobí žiadne volania argumentov nula alebo viac Super , výzva bez argumentu Super je vyrobené | Neplatí |
Získajte viac informácií o tejto téme
- Niektoré knihy, ktoré sa zaoberajú základmi konštruktorov a metód, sú
- Kompletný sprievodca pre štúdiu Java 2 Study Certification Guide, Simon Roberts a kol. (Sybex, 2000) //www.amazon.com/exec/obidos/ASIN/0782128254/qid=969399182/sr=1-2/102-9220485-9634548
- Java 2 (Exam Cram), Bill Brogden (Skupina Coriolis, 1999):
//www.amazon.com/exec/obidos/ASIN/1576102912/qid%3D969399279/102-9220485-9634548
- Java v kocke, Davis Flanagan (O'Reilly & Associates, 1999) // www.amazon.com/exec/obidos/ASIN/1565924878/o/qid=969399378/sr=2-1/102-9220485-9634548
- Navštívte webovú stránku Sun Microsystems, kde nájdete ďalšie informácie o metódach a konštruktéroch
//java.sun.com/docs/books/tutorial/trailmap.html
- Ak chcete získať viac obsahu Java pre začiatočníkov, prečítajte si JavaWorld 's nový Java 101 stĺpcová séria
//www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html
Tento príbeh „Pochopenie konštruktérov“ pôvodne publikoval server JavaWorld.