Programování

Porozumění konstruktérům

Říct, že konstruktér je metoda, je jako říkat, že australský ptakopysk je jen další savec. Abychom pochopili ptakopysk, je důležité vědět, jak se liší od ostatních savců. Abychom pochopili konstruktor, je podobně důležité pochopit, jak se liší od metody. Každý student jazyka Java, zejména ten, kdo studuje na certifikaci, musí tyto rozdíly znát; v tomto článku je konkrétně vysvětlím. Tabulka 1 na konci tohoto článku shrnuje klíčové rozdíly konstruktoru / metody.

Účel a funkce

Konstruktory mají v životě jeden účel: vytvořit instanci třídy. To lze také nazvat vytvořením objektu, jako v:

Platypus p1 = nový Platypus (); 

Účel metod je naproti tomu mnohem obecnější. Základní funkcí metody je provádění kódu Java.

Rozdíly v podpisu

Konstruktory a metody se liší ve třech aspektech podpisu: modifikátory, návratový typ a název. Stejně jako metody mohou mít konstruktory některý z modifikátorů přístupu: veřejný, chráněný, soukromý nebo žádný (často nazývaný balík nebo přátelský). Na rozdíl od metod mohou konstruktory přijmout pouze modifikátory přístupu. Proto konstruktory nemohou být abstraktní, finále, rodák, statickýnebo synchronizované.

Také typy návratů se velmi liší. Metody mohou mít jakýkoli platný návratový typ nebo žádný návratový typ, v takovém případě je návratový typ uveden jako prázdnota. Konstruktory nemají žádný návratový typ, dokonce ani prázdnota.

Nakonec z hlediska podpisu mají metody a konstruktory různá jména. Konstruktory mají stejný název jako jejich třída; podle konvence používají metody jiné názvy než název třídy. Pokud program Java dodržuje běžné konvence, metody začnou malým písmenem, konstruktory velkým písmenem. Názvy konstruktorů jsou také obvykle podstatná jména, protože názvy tříd jsou obvykle podstatná jména; názvy metod obvykle označují akce.

Použití „tohoto“

Konstruktory a metody používají klíčové slovo tento docela jinak. Metoda používá tento odkazovat na instanci třídy, která provádí metodu. Statické metody se nepoužívají tento; nepatří do instance třídy, takže tento nebude mít na co odkazovat. Statické metody patří do třídy jako celku, nikoli do instance. Konstruktéři používají tento odkazovat na jiného konstruktora ve stejné třídě s jiným seznamem parametrů. Prostudujte následující kód:

veřejná třída Platypus {název řetězce; Platypus (řetězec) {name = input; } Platypus () {this ("John / Mary Doe"); } public static void main (String args []) {Platypus p1 = new Platypus ("digger"); Platypus p2 = nový Platypus (); }} 

V kódu jsou dva konstruktory. První trvá a Tětiva vstup pojmenujte instanci. Druhý, bez parametrů, volá první konstruktor podle výchozího názvu „John / Mary Doe“.

Pokud konstruktor používá tento, musí být v prvním řádku konstruktoru; ignorování tohoto pravidla způsobí, že kompilátor vznese námitku.

Použití „super“

Metody i konstruktory používají super odkazovat na nadtřídu, ale různými způsoby. Metody použití super provést přepsanou metodu v nadtřídě, jak ukazuje následující příklad:

třída Mammal {void getBirthInfo () {System.out.println ("narozený naživu."); }} třída Platypus rozšiřuje Mammal {void getBirthInfo () {System.out.println ("poklop z vajec"); System.out.print („savec obvykle je“); super.getBirthInfo (); }} 

Ve výše uvedeném programu je volání na super.getBirthInfo () volá přepsanou metodu Savec nadtřída.

Konstruktéři používají super vyvolat konstruktor nadtřídy. Pokud konstruktor používá super, musí jej použít v prvním řádku; jinak si překladač stěžuje. Následuje příklad:

veřejná třída SuperClassDemo {SuperClassDemo () {}} třída Child rozšiřuje SuperClassDemo {Child () {super (); }} 

Ve výše uvedeném (a triviálním!) Příkladu konstruktor Dítě() zahrnuje volání na super, což způsobí třídu SuperClassDemo má být vytvořena instance, kromě Dítě třída.

Kód dodaný kompilátorem

Nový programátor Java může narazit, když kompilátor automaticky dodává kód pro konstruktory. To se stane, když napíšete třídu bez konstruktorů; překladač vám automaticky dodá konstruktor bez argumentů. Pokud tedy napíšete:

veřejná třída Příklad {} 

je funkčně ekvivalentní psaní:

veřejná třída Příklad {Příklad () {}} 

Kompilátor také automaticky dodává kód, když jej nepoužíváte super (s použitím nula nebo více parametrů) jako první řádek konstruktoru. V takovém případě počítač automaticky vloží super. Pokud tedy napíšete:

veřejná třída TestConstructors {TestConstructors () {}} 

je funkčně ekvivalentní psaní:

veřejná třída TestConstructors {TestConstructors () { super; } } 

Ostrooký začátečník se může divit, jak může výše uvedený program volat konstruktor nadřazené třídy, když TestConstructor nerozšiřuje žádnou třídu. Odpověď je, že Java rozšiřuje Objekt třída, když výslovně nerozšiřujete třídu. Kompilátor automaticky dodává konstruktor bez argumentu, pokud není výslovně deklarován žádný konstruktor, a automaticky dodává bez argumentu super volání, když konstruktor nemá žádné explicitní volání super. Následující dva fragmenty kódu jsou tedy funkčně ekvivalentní:

veřejná třída Příklad {} 

a

veřejná třída Příklad {Příklad () { super; } } 

Dědictví

Co se děje v následujícím scénáři? Právník čte závěť Třída. Členové Třída rodina se shromáždila kolem velkého konferenčního stolu, někteří jemně vzlykali. Právník čte: „Já, Třída, mít zdravou mysl a tělo, nechat všechny své konstruktéry mým dětem. "

Problém je v tom, že konstruktory nelze zdědit. Naštěstí pro Třída děti automaticky zdědí kteroukoli z metod svých rodičů, takže Třída děti se nestanou úplně opuštěnými.

Pamatujte, že metody Java se dědí, konstruktory nikoli. Zvažte následující třídu:

veřejná třída Příklad {public void sayHi {system.out.println ("Ahoj"); } Example () {}} veřejná třída SubClass rozšiřuje příklad {} 

The Podtřída třída automaticky dědí pozdravit metoda nalezená v nadřazené třídě. Konstruktor však Příklad() není zděděno Podtřída.

Shrnutí rozdílů

Stejně jako ptakopysk se liší od typického savce, liší se i konstruktéři od metod; konkrétně v jejich účelu, podpisu a použití tento a super. Kromě toho se konstruktory liší s ohledem na dědičnost a kód dodaný kompilátorem. Udržet všechny tyto detaily rovné může být fuška; následující tabulka poskytuje pohodlné shrnutí hlavních bodů. Další informace týkající se konstruktorů a metod najdete v části Zdroje níže.

Tabulka 1. Rozdíly mezi konstruktéry a metodami

TémaKonstruktéřiMetody
ÚčelVytvořte instanci třídySeskupte příkazy Java
ModifikátoryNemůže být abstraktní, finále, rodák, statickýnebo synchronizovanéMůže být abstraktní, finále, rodák, statickýnebo synchronizované
Návratový typŽádný návratový typ, dokonce ani prázdnotaprázdnota nebo platný návratový typ
názevStejný název jako třída (první písmeno je psáno velkými písmeny konvencí) - obvykle podstatné jménoLibovolné jméno kromě třídy. Názvy metod začínají podle konvence malým písmenem - obvykle názvem akce
tentoOdkazuje na jiného konstruktora ve stejné třídě. Pokud je použit, musí to být první řádek konstruktoruOdkazuje na instanci vlastnící třídy. Nelze použít statické metody
superVolá konstruktor nadřazené třídy. Pokud se používá, musí to být první řádek konstruktoruVolá přepsanou metodu v nadřazené třídě
DědictvíKonstruktory nejsou zděděnyMetody se dědí
Kompilátor automaticky dodává výchozí konstruktorPokud třída nemá žádný konstruktor, automaticky se zadá konstruktor bez argumentuNeplatí
Kompilátor automaticky dodává výchozí volání konstruktoru nadtřídyPokud konstruktor neprovádí žádná volání argumentů nula nebo více super, volání bez argumentů super je vyrobenoNeplatí
Robert Nielsen je Sun Certified Java 2 Programmer. Je držitelem magisterského titulu v pedagogice se specializací na výuku na počítači a několik let učil v oboru počítačů. Publikoval také články týkající se počítačů v různých časopisech.

Další informace o tomto tématu

  • Některé knihy, které pokrývají základy konstruktérů a metod, jsou
  • Kompletní průvodce certifikací Java 2 Study, 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 (The Coriolis Group, 1999):

    //www.amazon.com/exec/obidos/ASIN/1576102912/qid%3D969399279/102-9220485-9634548

  • Java v kostce, Davis Flanagan (O'Reilly & Associates, 1999) // www.amazon.com/exec/obidos/ASIN/1565924878/o/qid=969399378/sr=2-1/102-9220485-9634548
  • Navštivte web Sun Microsystems, kde získáte další informace o metodách a konstruktorech

    //java.sun.com/docs/books/tutorial/trailmap.html

  • Další obsah Java pro začátečníky si přečtěte JavaWorld 'je nový Java 101 řada sloupců

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

Tento příběh „Porozumění konstruktérům“ původně publikoval JavaWorld.

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