Ří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éma | Konstruktéři | Metody |
---|---|---|
Účel | Vytvořte instanci třídy | Seskupte příkazy Java |
Modifikátory | Nemůž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ázdnota | prázdnota nebo platný návratový typ |
název | Stejný název jako třída (první písmeno je psáno velkými písmeny konvencí) - obvykle podstatné jméno | Libovolné jméno kromě třídy. Názvy metod začínají podle konvence malým písmenem - obvykle názvem akce |
tento | Odkazuje na jiného konstruktora ve stejné třídě. Pokud je použit, musí to být první řádek konstruktoru | Odkazuje na instanci vlastnící třídy. Nelze použít statické metody |
super | Volá konstruktor nadřazené třídy. Pokud se používá, musí to být první řádek konstruktoru | Volá přepsanou metodu v nadřazené třídě |
Dědictví | Konstruktory nejsou zděděny | Metody se dědí |
Kompilátor automaticky dodává výchozí konstruktor | Pokud třída nemá žádný konstruktor, automaticky se zadá konstruktor bez argumentu | Neplatí |
Kompilátor automaticky dodává výchozí volání konstruktoru nadtřídy | Pokud konstruktor neprovádí žádná volání argumentů nula nebo více super , volání bez argumentů super je vyrobeno | Neplatí |
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.