Sakymas, kad konstruktorius yra metodas, yra tarsi sakymas, kad Australijos plačiaplaukis yra tik dar vienas žinduolis. Norint suprasti platypus, svarbu žinoti, kuo ji skiriasi nuo kitų žinduolių. Norint suprasti konstruktorių, taip pat svarbu suprasti, kuo jis skiriasi nuo metodo. Bet kuris „Java“ studentas, ypač studijuojantis atestaciją, turi žinoti tuos skirtumus; šiame straipsnyje aš juos konkrečiai išdėstysiu. 1 lentelėje šio straipsnio pabaigoje apibendrinami pagrindiniai konstruktoriaus / metodo skirtumai.
Tikslas ir funkcija
Konstruktoriai turi vieną gyvenimo tikslą: sukurti klasės egzempliorių. Tai taip pat gali būti vadinama objekto kūrimu, kaip aprašyta:
Platypus p1 = naujasis Platypus ();
Metodų tikslas, priešingai, yra daug bendresnis. Pagrindinė metodo funkcija yra „Java“ kodo vykdymas.
Parašo skirtumai
Konstruktoriai ir metodai skiriasi trimis parašo aspektais: modifikatoriais, grąžinimo tipu ir pavadinimu. Kaip ir metodai, konstruktoriai gali turėti bet kurį iš prieigos modifikatorių: viešąjį, apsaugotą, privatų arba jokį (dažnai vadinamą) pakuotė arba draugiškas). Skirtingai nuo metodų, konstruktoriai gali priimti tik prieigos modifikatorius. Todėl konstruktoriai negali būti abstraktus
, galutinis
, gimtoji
, statinis
arba sinchronizuotas
.
Grąžinimo tipai taip pat labai skiriasi. Metodai gali turėti bet kokį galiojantį grąžinimo tipą arba be grąžinimo tipo, tokiu atveju grąžinimo tipas nurodomas kaip tuštuma
. Konstruktoriai neturi grąžinimo tipo, net ne tuštuma
.
Galiausiai, kalbant apie parašą, metodai ir konstruktoriai turi skirtingus pavadinimus. Konstruktoriai turi tą patį pavadinimą kaip ir jų klasė; pagal susitarimą metodai naudoja ne klasės, o kitus pavadinimus. Jei „Java“ programa laikosi įprastų susitarimų, metodai prasidės mažąja raide, konstruktoriai - didele. Taip pat konstruktorių vardai paprastai yra daiktavardžiai, nes klasių pavadinimai dažniausiai yra daiktavardžiai; metodo pavadinimai paprastai nurodo veiksmus.
„Tai“ naudojimas
Konstruktoriai ir metodai naudoja raktinį žodį tai
visai kitaip. Naudojamas metodas tai
nurodyti klasės, vykdančios metodą, egzempliorių. Statiniai metodai nenaudojami tai
; jie nepriklauso klasės egzemplioriui, taigi tai
neturėtų į ką remtis. Statiniai metodai priklauso visai klasei, o ne egzemplioriui. Konstruktoriai naudoja tai
nurodyti kitą tos pačios klasės konstruktorių su kitokiu parametrų sąrašu. Išstudijuokite šį kodą:
viešoji klasė Platypus {String name; Platypus (String input) {pavadinimas = įvestis; } Platypus () {this ("Jonas / Marija Doe"); } public static void main (String args []) {Platypus p1 = new Platypus ("kasėjas"); Platypus p2 = naujasis Platypus (); }}
Kode yra du konstruktoriai. Pirmasis užima a Stygos
įvade egzemplioriui pavadinti. Antrasis, neatsižvelgdamas į parametrus, pirmąjį konstruktorių vadina numatytuoju vardu „Jonas / Marija Doe“
.
Jei konstruktorius naudoja tai
, jis turi būti pirmoje konstruktoriaus eilutėje; ignoruodamas šią taisyklę kompiliatorius prieštaraus.
„Super“ naudojimas
Tiek metodai, tiek konstruktoriai naudoja super
kalbėti apie superklasę, tačiau skirtingais būdais. Naudojami metodai super
superklasėje atlikti nepaisomą metodą, kaip parodyta šiame pavyzdyje:
klasės Žinduolis {void getBirthInfo () {System.out.println ("gimęs gyvas"); }} Platypus pratęsia Žinduolis {void getBirthInfo () {System.out.println ("išsirita iš kiaušinių"); System.out.print („žinduolis paprastai yra“); super.getBirthInfo (); }}
Aukščiau pateiktoje programoje skambutis į super.getBirthInfo ()
vadina nepaisomą Žinduolis
superklasė.
Konstruktoriai naudoja super
pasikviesti superklasės konstruktorių. Jei konstruktorius naudoja super
, jis turi jį naudoti pirmoje eilutėje; kitaip kompiliatorius skųsis. Toliau pateikiamas pavyzdys:
public class SuperClassDemo {SuperClassDemo () {}} class Child pratęsia SuperClassDemo {Child () {super (); }}
Pirmiau pateiktame (ir trivialiame!) Pavyzdyje konstruktorius Vaikas ()
apima skambutį super
, kuris sukelia klasę „SuperClassDemo“
turi būti išaiškinta, be Vaikas
klasė.
Kompiliatoriaus pateiktas kodas
Naujasis „Java“ programuotojas gali suklupti, kai kompiliatorius automatiškai pateikia konstruktoriams kodą. Taip nutinka, jei rašote klasę be konstruktorių; kompiliatorius jums automatiškai pateiks konstruktorių be argumentų. Taigi, jei rašote:
viešosios klasės pavyzdys {}
tai funkciškai prilygsta rašymui:
viešosios klasės pavyzdys {Pavyzdys () {}}
Kompiliatorius taip pat automatiškai pateikia kodą, kai nenaudojate super
(naudojant nulį ar daugiau parametrų) kaip pirmoji konstruktoriaus eilutė. Tokiu atveju kompiuteris automatiškai įterpiamas super
. Taigi, jei rašote:
viešosios klasės „TestConstructors“ {TestConstructors () {}}
tai funkciškai prilygsta rašymui:
viešosios klasės „TestConstructors“ {TestConstructors () { super
; } }
Aštriaakis pradedantysis gali susimąstyti, kaip aukščiau nurodyta programa gali paskambinti tėvų klasės konstruktoriui TestConstructor
nepratęsia jokios klasės. Atsakymas yra tas, kad Java pratęsia Objektas
klasė, kai jūs aiškiai nepratęsiate klasės. Kompiliatorius automatiškai pateikia konstruktorių be argumento, jei nė vienas konstruktorius nėra aiškiai deklaruojamas, ir automatiškai pateikia argumentą be argumento super
skambinti, kai konstruktorius neturi aiškaus skambučio super
. Taigi šie du kodo fragmentai yra funkciškai lygiaverčiai:
viešosios klasės pavyzdys {}
ir
viešosios klasės pavyzdys {Pavyzdys () { super
; } }
Paveldėjimas
Kas yra blogai šiame scenarijuje? Advokatas skaito testamentą Klasė
. Europos Parlamento nariai Klasė
šeima susirenka prie didelio konferencijų stalo, kai kurie švelniai verkšlena. Advokatas skaito: „Aš, Klasė
, būdamas sveiko proto ir kūno, visus mano konstruktorius palikite savo vaikams “.
Problema ta, kad konstruktorių negalima paveldėti. Laimei Klasė
vaikų, jie automatiškai paveldės bet kurį iš savo tėvų metodų, todėl Klasė
vaikai netaps visiškai nepasiturintys.
Atminkite, kad „Java“ metodai yra paveldimi, o konstruktoriai - ne. Apsvarstykite šią klasę:
public class Pavyzdys {public void sayHi {system.out.println ("Labas"); } Pavyzdys () {}} public class SubClass prailgina pavyzdį {}
Poklasis
klasė automatiškai paveldi sakyk labas
metodas rastas tėvų klasėje. Tačiau konstruktorius Pavyzdys()
nėra paveldima Poklasis
.
Apibendrinant skirtumus
Kaip platypus skiriasi nuo tipiško žinduolio, taip ir konstruktoriai skiriasi nuo metodų; jų paskirtimi, parašu ir naudojimu tai
ir super
. Be to, konstruktoriai skiriasi pagal paveldėjimą ir kompiliatoriaus pateiktą kodą. Išlaikyti visas šias detales tiesiai gali būti nemalonu; šioje lentelėje pateikiama patogi svarbiausių dalykų santrauka. Daugiau informacijos apie konstruktorius ir metodus rasite toliau esančiame skyriuje „Ištekliai“.
1 lentelė. Konstruktorių ir metodų skirtumai
Tema | Konstruktoriai | Metodai |
---|---|---|
Tikslas | Sukurkite klasės egzempliorių | Grupiniai „Java“ teiginiai |
Modifikatoriai | Negali būti abstraktus , galutinis , gimtoji , statinis arba sinchronizuotas | Gali būti abstraktus , galutinis , gimtoji , statinis arba sinchronizuotas |
Grąžinimo tipas | Jokio grąžinimo tipo, net ne tuštuma | tuštuma arba galiojantis grąžinimo tipas |
vardas | Tas pats vardas kaip klasė (pirmoji raidė rašoma didžiosiomis raidėmis pagal susitarimą) - paprastai daiktavardis | Bet koks vardas, išskyrus klasę. Metodo pavadinimai prasideda mažąja raide pagal susitarimą - dažniausiai veiksmo pavadinimas |
tai | Nurodo kitą tos pačios klasės konstruktorių. Jei naudojamas, tai turi būti pirmoji konstruktoriaus eilutė | Nurodo turimos klasės egzempliorių. Negalima naudoti statiniais metodais |
super | Skambina tėvų klasės konstruktoriui. Jei naudojamas, tai turi būti pirmoji konstruktoriaus eilutė | Kviečia nepaisomą metodą tėvų klasėje |
Paveldėjimas | Konstruktoriai nėra paveldimi | Metodai yra paveldimi |
Kompiliatorius automatiškai pateikia numatytąjį konstruktorių | Jei klasėje nėra konstruktoriaus, konstruktorius be argumentų pateikiamas automatiškai | Netaikoma |
Kompiliatorius automatiškai pateikia numatytąjį iškvietimą superklasės konstruktoriui | Jei konstruktorius nereikalauja jokių nulinių ar daugiau argumentų super , skambutis be argumentų super yra pagamintas | Netaikoma |
Sužinokite daugiau apie šią temą
- Kai kurios knygos, kuriose aprašomi konstruktorių ir metodų pagrindai, yra
- Išsamų „Java 2“ studijų atestavimo vadovą, Simonas Robertsas ir kt. (Sybex, 2000) //www.amazon.com/exec/obidos/ASIN/0782128254/qid=969399182/sr=1-2/102-9220485-9634548
- „Java 2“ („Exam Cram“), Billas Brogdenas („The Coriolis Group“, 1999):
//www.amazon.com/exec/obidos/ASIN/1576102912/qid%3D969399279/102-9220485-9634548
- „Java“ trumpai, Davisas Flanaganas (O'Reilly & Associates, 1999) // www.amazon.com/exec/obidos/ASIN/1565924878/o/qid=969399378/sr=2-1/102-9220485-9634548
- Norėdami sužinoti daugiau apie metodus ir konstruktorius, apsilankykite „Sun Microsystems“ svetainėje
//java.sun.com/docs/books/tutorial/trailmap.html
- Norėdami sužinoti daugiau „Java“ turinio pradedantiesiems, skaitykite „JavaWorld“s naujas „Java 101“ stulpelių serija
//www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html
Šią istoriją „Suprasti konstruktorius“ iš pradžių paskelbė „JavaWorld“.