Programavimas

Suprasti konstruktorius

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, statinisarba 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

TemaKonstruktoriaiMetodai
TikslasSukurkite klasės egzemplioriųGrupiniai „Java“ teiginiai
ModifikatoriaiNegali būti abstraktus, galutinis, gimtoji, statinisarba sinchronizuotasGali būti abstraktus, galutinis, gimtoji, statinisarba sinchronizuotas
Grąžinimo tipasJokio grąžinimo tipo, net ne tuštumatuštuma arba galiojantis grąžinimo tipas
vardasTas pats vardas kaip klasė (pirmoji raidė rašoma didžiosiomis raidėmis pagal susitarimą) - paprastai daiktavardisBet koks vardas, išskyrus klasę. Metodo pavadinimai prasideda mažąja raide pagal susitarimą - dažniausiai veiksmo pavadinimas
taiNurodo 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
superSkambina tėvų klasės konstruktoriui. Jei naudojamas, tai turi būti pirmoji konstruktoriaus eilutėKviečia nepaisomą metodą tėvų klasėje
PaveldėjimasKonstruktoriai nėra paveldimiMetodai yra paveldimi
Kompiliatorius automatiškai pateikia numatytąjį konstruktoriųJei klasėje nėra konstruktoriaus, konstruktorius be argumentų pateikiamas automatiškaiNetaikoma
Kompiliatorius automatiškai pateikia numatytąjį iškvietimą superklasės konstruktoriuiJei konstruktorius nereikalauja jokių nulinių ar daugiau argumentų super, skambutis be argumentų super yra pagamintasNetaikoma
Robertas Nielsenas yra „Sun“ sertifikuotas „Java 2“ programuotojas. Jis turi edukologijos magistro laipsnį, specializuojasi kompiuterinio mokymo srityje ir keletą metų dėstė kompiuterių srityje. Jis taip pat yra paskelbęs su kompiuteriais susijusių straipsnių įvairiuose žurnaluose.

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“.