Programovanie

Pochopenie konštruktérov

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émaKonštruktériMetódy
ÚčelVytvorte inštanciu triedySkupinové príkazy Java
ModifikátoryNemôž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ázovRovnaké 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
totoOdkazuje na iného konštruktéra v rovnakej triede. Ak sa použije, musí to byť prvý riadok konštruktoraOdkazuje na inštanciu triedy vlastniacej. Nie je možné použiť statické metódy
SuperZavolá konštruktor nadradenej triedy. Ak sa použije, musí to byť prvý riadok konštruktoraZavolá prepísanú metódu v nadradenej triede
DedenieKonštruktéri sa nedediaMetódy sa dedia
Kompilátor automaticky dodáva predvolený konštruktorAk trieda nemá žiadny konštruktor, automaticky sa dodá konštruktor bez argumentovNeplatí
Kompilátor automaticky dodáva predvolené volanie konštruktoru nadtriedyAk konštruktor neurobí žiadne volania argumentov nula alebo viac Super, výzva bez argumentu Super je vyrobenéNeplatí
Robert Nielsen je programátorom Java 2 certifikovaným spoločnosťou Sun. Je držiteľom magisterského titulu z pedagogiky so špecializáciou na výučbu pomocou počítača a niekoľko rokov učil v počítačovej oblasti. Publikoval tiež články týkajúce sa počítačov v rôznych časopisoch.

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.

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