At sige, at en konstruktør er en metode, er som at sige, at den australske platypus bare er et andet pattedyr. For at forstå platypus er det vigtigt at vide, hvordan det adskiller sig fra andre pattedyr. For at forstå konstruktøren er det ligeledes vigtigt at forstå, hvordan det adskiller sig fra en metode. Enhver Java-studerende, især en, der studerer til certificering, har brug for at kende disse forskelle; i denne artikel vil jeg konkret stave dem ud. Tabel 1, i slutningen af denne artikel, opsummerer nøglekonstruktøren / metodens forskelle.
Formål og funktion
Konstruktører har et formål i livet: at skabe en instans af en klasse. Dette kan også kaldes oprettelse af et objekt, som i:
Platypus p1 = ny Platypus ();
Formålet med metoder er derimod meget mere generelt. En metodes grundlæggende funktion er at udføre Java-kode.
Signaturforskelle
Konstruktører og metoder adskiller sig i tre aspekter af signaturen: modifikatorer, returtype og navn. Ligesom metoder kan konstruktører have en hvilken som helst adgangsmodifikator: offentlig, beskyttet, privat eller ingen (ofte kaldet pakke eller venlige). I modsætning til metoder kan konstruktører kun tage adgangsmodifikatorer. Derfor kan konstruktører ikke være det abstrakt
, endelig
, hjemmehørende
, statisk
, eller synkroniseret
.
Returtyperne er også meget forskellige. Metoder kan have en hvilken som helst gyldig returtype eller ingen returtype, i hvilket tilfælde returtypen er angivet som ugyldig
. Konstruktører har ingen returtype, ikke engang ugyldig
.
Endelig med hensyn til signaturen har metoder og konstruktører forskellige navne. Konstruktører har samme navn som deres klasse; ved konvention bruger metoder andre navne end klassens navn. Hvis Java-programmet følger normale konventioner, starter metoderne med små bogstaver, konstruktører med store bogstaver. Også konstruktørnavne er normalt navneord, fordi klassenavne normalt er navneord; Metodenavne angiver normalt handlinger.
Brugen af "dette"
Konstruktører og metoder bruger nøgleordet det her
helt anderledes. En metode bruger det her
at henvise til forekomsten af klassen, der udfører metoden. Statiske metoder anvendes ikke det her
; de hører ikke til en klasseinstans, så det her
ville ikke have noget at henvise til. Statiske metoder hører til klassen som helhed snarere end til en instans. Konstruktører bruger det her
at henvise til en anden konstruktør i samme klasse med en anden parameterliste. Undersøg følgende kode:
offentlig klasse Platypus {Strengnavn; Platypus (strengindgang) {name = input; Platypus () {denne ("John / Mary Doe"); } offentlig statisk ugyldig hoved (String args []) {Platypus p1 = ny Platypus ("digger"); Platypus p2 = ny Platypus (); }}
I koden er der to konstruktører. Den første tager en Snor
input for at navngive forekomsten. Den anden, uden parametre, kalder den første konstruktør med standardnavnet "John / Mary Doe"
.
Hvis en konstruktør bruger det her
, det skal være i konstruktørens første linje; ignorering af denne regel får compileren til at gøre indsigelse.
Brugen af "super"
Metoder og konstruktører bruger begge super
at henvise til en superklasse, men på forskellige måder. Metoder super
at udføre en tilsidesat metode i superklassen, som det følgende eksempel illustrerer:
klasse Pattedyr {ugyldig getBirthInfo () {System.out.println ("født i live."); }} klasse Platypus udvider Pattedyr {void getBirthInfo () {System.out.println ("luge fra æg"); System.out.print ("et pattedyr er normalt"); super.getBirthInfo (); }}
I ovenstående program kaldes op til super.getBirthInfo ()
kalder den tilsidesatte metode til Pattedyr
superklasse.
Konstruktører bruger super
at påberåbe sig superklassens konstruktør. Hvis en konstruktør bruger super
, det skal bruge det i første linje; Ellers vil compileren klage. Et eksempel følger:
offentlig klasse SuperClassDemo {SuperClassDemo () {}} klasse Child udvider SuperClassDemo {Child () {super (); }}
I ovenstående (og trivielt!) Eksempel, konstruktøren Barn()
inkluderer et opkald til super
, som forårsager klassen SuperClassDemo
at blive instantieret ud over Barn
klasse.
Compiler-leveret kode
Den nye Java-programmør kan snuble, når compileren automatisk leverer kode til konstruktører. Dette sker, hvis du skriver en klasse uden konstruktører; compileren leverer automatisk en no-argument konstruktør til dig. Således, hvis du skriver:
offentlig klasse Eksempel {}
det svarer funktionelt til skrivning:
offentlig klasse Eksempel {Eksempel () {}}
Compileren leverer også automatisk kode, når du ikke bruger den super
(ved hjælp af nul eller flere parametre) som den første linje i en konstruktør. I dette tilfælde indsættes computeren automatisk super
. Således, hvis du skriver:
offentlig klasse TestConstructors {TestConstructors () {}}
det svarer funktionelt til skrivning:
offentlig klasse TestConstructors {TestConstructors () { super
; } }
Den skarpe øjne begynder måske at undre sig over, hvordan ovenstående program kan kalde forældreklassens konstruktør, hvornår Testkonstruktør
udvider ikke nogen klasse. Svaret er, at Java udvider Objekt
klasse, når du ikke eksplicit udvider en klasse. Compileren leverer automatisk en konstruktør uden argument, hvis ingen konstruktør udtrykkeligt er erklæret, og leverer automatisk et ikke-argument super
kald, når en konstruktør ikke har noget eksplicit kald til super
. Så følgende to kodestykker er funktionelt ækvivalente:
offentlig klasse Eksempel {}
og
public class Eksempel {Eksempel () { super
; } }
Arv
Hvad er der galt med følgende scenarie? En advokat læser testamentet fra En klasse
. Medlemmer af Klasse
familien er samlet omkring et stort konferencebord, nogle gråt forsigtigt. Advokaten læser: "Jeg, En klasse
, hvis jeg har sundt sind og krop, overlader alle mine konstruktører til mine børn. "
Problemet er, at konstruktører ikke kan arves. Heldigvis for Klasse
børn, vil de automatisk arve nogen af deres forældres metoder, så den Klasse
børn bliver ikke helt fattige.
Husk, Java-metoder arves, konstruktører ikke. Overvej følgende klasse:
public class Eksempel {public void sayHi {system.out.println ("Hej"); } Eksempel () {}} SubClass for offentlig klasse udvider eksempel {}
Det Underklasse
klasse arver automatisk sig hej
metode fundet i overordnet klasse. Imidlertid konstruktøren Eksempel()
arves ikke af Underklasse
.
Sammenfatning af forskellene
Ligesom platypus adskiller sig fra det typiske pattedyr, så skiller konstruktører sig også fra metoder; specifikt i deres formål, underskrift og brug af det her
og super
. Derudover adskiller konstruktører sig med hensyn til arv og kodeleveret kode. At holde alle disse detaljer lige kan være en opgave; følgende tabel giver en praktisk oversigt over de fremtrædende punkter. Du kan finde flere oplysninger om konstruktører og metoder i afsnittet Ressourcer nedenfor.
Tabel 1. Forskelle mellem konstruktører og metoder
Emne | Konstruktører | Metoder |
---|---|---|
Formål | Opret en forekomst af en klasse | Grupper Java-udsagn |
Modifikatorer | Kan ikke være abstrakt , endelig , hjemmehørende , statisk , eller synkroniseret | Måske abstrakt , endelig , hjemmehørende , statisk , eller synkroniseret |
Returtype | Ingen returretype, ikke engang ugyldig | ugyldig eller en gyldig returtype |
Navn | Samme navn som klassen (det første bogstav er stort med konventionen) - normalt et substantiv | Ethvert navn undtagen klassen. Metodenavne begynder med små bogstaver efter konvention - normalt navnet på en handling |
det her | Henviser til en anden konstruktør i samme klasse. Hvis det bruges, skal det være konstruktørens første linje | Henviser til en forekomst af ejerklassen. Kan ikke bruges ved statiske metoder |
super | Ringer til konstruktøren af forældreklassen. Hvis den bruges, skal den være den første linje i konstruktøren | Kalder til en tilsidesat metode i overordnet klasse |
Arv | Konstruktører arves ikke | Metoder nedarves |
Compiler leverer automatisk en standardkonstruktør | Hvis klassen ikke har nogen konstruktør, leveres der automatisk en konstruktør uden argument | Gælder ikke |
Compiler leverer automatisk et standardopkald til superklassekonstruktøren | Hvis konstruktøren ikke giver noget nul-eller-mere-argument, kalder det til super , et opkald uden argument til super er lavet | Gælder ikke |
Lær mere om dette emne
- Nogle bøger, der dækker det grundlæggende om konstruktører og metoder er
- Den komplette Java 2-studiecertificeringsvejledning, Simon Roberts et al. (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 i en nøddeskal, Davis Flanagan (O'Reilly & Associates, 1999) // www.amazon.com/exec/obidos/ASIN/1565924878/o/qid=969399378/sr=2-1/102-9220485-9634548
- Besøg Sun Microsystems-webstedet for mere dækning af metoder og konstruktører
//java.sun.com/docs/books/tutorial/trailmap.html
- For mere Java-indhold til begyndere, læs JavaWorld 's nye Java 101 søjleserie
//www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html
Denne historie, "Understanding constructors" blev oprindeligt udgivet af JavaWorld.