I objektorienteret programmering er en konstruktør en speciel funktion, som du kalder for at oprette et objekt. Konstruktører har flere unikke funktioner, der gør det muligt for dem at arbejde.

I Java navngiver du en konstruktør efter sin klasse. En konstruktør er en metode, defineret i den klasse, den gælder for. Java-konstruktører kan bruge overbelastning til at give alternativ adfærd. Konstruktører i Java kan også bruge arv til at genbruge kode.

Hvorfor har du brug for konstruktører alligevel?

Konstruktører er en grundpille i objektorienteret programmering, og Java er ingen undtagelse. Dette eksempel viser, hvordan du kan definere en grundlæggende cirkelklasse med en dataegenskab og en metode:

offentlig klassecirkel {
offentlig dobbeltradius;
offentligt dobbeltområde () {returnere 3.14159 * radius * radius; }
}

Du kan derefter oprette en forekomst af denne klasse og interagere med den:

Cirkel c = ny cirkel ();
c.radius = 2;
System.out.println (c.area ()); // 12.56636

Men dette er mindre praktisk og robust, end det kunne være. Det er god objektorienteret praksis at indkapsle data og beskytte dem mod uautoriseret adgang:

offentlig klassecirkel {
privat dobbelt radius;
offentligt dobbeltområde () {returnere 3.14159 * radius * radius; }
public void setRadius (dobbelt r) {radius = r; }
}

Nu kan kaldekoden bruge sæt Radius metode og ikke behøver at bekymre sig om dens implementeringsoplysninger:

Cirkel c = ny cirkel ();
c.setRadius (2);

Konstruktører tilbyder en endnu bedre måde at levere data til et objekt, når du opretter det. De bruges meget ofte til initialisering af egenskaber, som f.eks radius her.

Eksempler på enkle konstruktører

Den mest basale konstruktør er en uden argumenter, der ikke gør noget:

offentlig klassecirkel {
offentlig cirkel () {}
}

Se også: Lær hvordan du opretter klasser i Java

Hvis du ikke definerer en konstruktør, giver Java en standard, der opfører sig på samme måde.

Bemærk et par ting:

  1. Navnet på konstruktøren matcher klassens navn.
  2. Denne konstruktør bruger offentlig adgangsmodifikator, så enhver anden kode kan kalde det.
  3. En konstruktør inkluderer ikke en returtype. I modsætning til andre metoder kan konstruktører ikke returnere en værdi.

Konstruktører udfører typisk en slags initialisering. Bemærk, at ovenstående kode ikke initialiserer radiusværdien. I dette tilfælde indstiller sproget det automatisk til nul. Denne klasse forventer, at en bruger skal bruge setRadius (). For at bruge en mere nyttig standard end 0 kan du tildele den inden for konstruktøren:

offentlig klassecirkel {
offentlig cirkel () {radius = 1; }
}

Cirkler oprettet med denne klasse vil i det mindste nu have et faktisk område! Den, der ringer op, kan stadig bruge setRadius () at give en anden radius end 1. Men konstruktøren kan være endnu mere venlig:

offentlig klassecirkel {
offentlig cirkel (dobbelt r) {radius = r; }
}

Nu kan du oprette cirkler med en bestemt radius lige fra fødslen:

Cirkel c = ny cirkel (2);
System.out.println (c.area ()); // 12.56636

Dette er en meget almindelig anvendelse for konstruktører. Du bruger dem ofte til at initialisere variabler til parameterværdier.

Konstruktøroverbelastning

Du kan angive mere end en konstruktør i en klassedefinition:

offentlig cirkel () {radius = 1; }
offentlig cirkel (dobbelt r) {radius = r; }

Dette giver telefonkoden et valg af, hvordan man konstruerer objekter:

Cirkel c1 = ny cirkel (2);
Cirkel c2 = ny cirkel ();
System.out.println (c1.area () + "," + c2.area ()); // 12.56636, 3.14159

Med en lidt mere kompleks cirkel kan du udforske mere interessante konstruktører. Denne version gemmer sin position:

offentlig klassecirkel {
offentlig dobbelt x, y, radius;
offentlig cirkel () {radius = r; }
offentlig cirkel (dobbelt r) {radius = r; }
offentlig cirkel (dobbelt x, dobbelt y, dobbelt r) {
this.x = x; this.y = y; radius = r;
}

offentligt dobbeltområde () {returnere 3.14159 * radius * radius; }
}

Du kan nu oprette en cirkel uden argumenter, en enkelt radius eller x- og y-koordinater ved siden af ​​radiusen. Dette er den samme slags overbelastning, som Java understøtter til enhver metode.

Constructor Chains

Hvad med at oprette en cirkel, baseret på en anden? Dette ville give os muligheden for let at kopiere cirkler. Overhold følgende blok:

offentlig cirkel (cirkel c) {
this.x = c.x;
this.y = c.y;
denne.radius = c.radius;
}

Dette fungerer, men det gentager nogle koder unødigt. Da klassen Circle allerede har en konstruktør, der håndterer de enkelte egenskaber, kan du i stedet kalde det ved hjælp af det her nøgleord:

offentlig cirkel (cirkel c) {
dette (c.x, c.y, c.radius);
}

Dette er en form for konstruktorkæde, der kalder en konstruktør fra en anden. Det bruger mindre kode og hjælper med at centralisere en operation snarere end at duplikere den.

Ringer til forældrekonstruktøren

Den anden form for konstruktorkædning opstår, når en konstruktør kalder en konstruktør i sin overordnede klasse. Dette kan enten være eksplicit eller implicit. For at ringe eksplicit til en forældrekonstruktør skal du bruge super nøgleord:

super (x, y);

Forestil dig en formklasse, der fungerer som forælder til cirklen:

offentlig klasseform {
dobbelt x, y;
offentlig figur (dobbelt _x, dobbelt _y) {x = _x; y = _y; }
}

Det håndterer fælles positionering for alle former, da dette er funktionalitet, som de alle deler. Nu kan Circle-klassen delegere positionshåndtering til sin forælder:

offentlig klassecirkel udvider form {
dobbelt radius;
offentlig cirkel (dobbelt r) {super (0, 0); radius = r; }
offentlig cirkel (dobbelt x, dobbelt y, dobbelt r) {
super (x, y);
radius = r;
}
}

Superklassekonstruktion er et meget vigtigt aspekt af arv i Java. Sproget håndhæver det som standard, hvis du ikke udtrykkeligt ringer super i dine konstruktører.

Adgang modifikatorer på konstruktører

Konstruktører kan inkludere en adgangsmodifikator i deres signatur. Ligesom andre metoder definerer dette, hvilke typer opkaldere der kan få adgang til konstruktøren:

offentlig klassetest {
privat statisk test unikInstance = ny test ();
privat test () {}
offentlig statisk test getInstance () {
returnere unikInstance;
}
}

Dette er et mere kompliceret eksempel, så pas på at forstå det:

  • Klassen er ikke abstrakt, så det er muligt at instantiere fra den.
  • Konstruktøren er privat, så kun denne klasse selv kan oprette en ny instans.
  • Via en statisk egenskab og metode udsætter klassen en enkelt, unik forekomst af sig selv for opkaldere.

Brug konstruktører i Java til at oprette objekter

Konstruktører er afgørende for objektorienteret programmering. De giver dig mulighed for at oprette objekter, hvilket er vigtigt!

I Java ligner konstruktører andre metoder og fungerer stort set på samme måde. Du skal huske de specielle regler omkring standardkonstruktører, overbelastning og konstruktorkæde. Hvis konstruktører er nye for dig, vil du måske læse om de andre kernekoncepter, du skal lære, når du kommer i gang.

E-mail
10 Core Java-koncepter, du bør lære, når du kommer i gang

Uanset om du skriver en GUI, udvikler serversidesoftware eller en mobilapplikation ved hjælp af Android, lærer Java dig godt. Her er nogle centrale Java-koncepter, der hjælper dig med at komme i gang.

Læs Næste

Relaterede emner
  • Programmering
  • Java
  • Kodningstip
Om forfatteren
Bobby Jack (51 udgivne artikler)

Bobby er en teknologientusiast, der arbejdede som softwareudvikler i det meste af to årtier. Han brænder for spil, arbejder som Reviews Editor i Switch Player Magazine og er fordybet i alle aspekter af onlineudgivelse og webudvikling.

Mere fra Bobby Jack

Abonner på vores nyhedsbrev

Deltag i vores nyhedsbrev for tekniske tip, anmeldelser, gratis e-bøger og eksklusive tilbud!

Et trin mere !!!

Bekræft din e-mail-adresse i den e-mail, vi lige har sendt dig.

.