Programmering

Forståelse konstruktører

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

EmneKonstruktørerMetoder
FormålOpret en forekomst af en klasseGrupper Java-udsagn
ModifikatorerKan ikke være abstrakt, endelig, hjemmehørende, statisk, eller synkroniseretMåske abstrakt, endelig, hjemmehørende, statisk, eller synkroniseret
ReturtypeIngen returretype, ikke engang ugyldigugyldig eller en gyldig returtype
NavnSamme navn som klassen (det første bogstav er stort med konventionen) - normalt et substantivEthvert navn undtagen klassen. Metodenavne begynder med små bogstaver efter konvention - normalt navnet på en handling
det herHenviser til en anden konstruktør i samme klasse. Hvis det bruges, skal det være konstruktørens første linjeHenviser til en forekomst af ejerklassen. Kan ikke bruges ved statiske metoder
superRinger til konstruktøren af ​​forældreklassen. Hvis den bruges, skal den være den første linje i konstruktørenKalder til en tilsidesat metode i overordnet klasse
ArvKonstruktører arves ikkeMetoder nedarves
Compiler leverer automatisk en standardkonstruktørHvis klassen ikke har nogen konstruktør, leveres der automatisk en konstruktør uden argumentGælder ikke
Compiler leverer automatisk et standardopkald til superklassekonstruktørenHvis konstruktøren ikke giver noget nul-eller-mere-argument, kalder det til super, et opkald uden argument til super er lavetGælder ikke
Robert Nielsen er en Sun Certified Java 2 programmør. Han har en kandidatgrad i uddannelse med speciale i computerassisteret instruktion og har undervist inden for computerområdet i flere år. Han har også offentliggjort computerrelaterede artikler i en række forskellige magasiner.

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.