I objektorienterad programmering är en konstruktör en speciell funktion som du ringer för att skapa ett objekt. Konstruktörer har flera unika funktioner som gör att de kan arbeta.
I Java namnge du en konstruktör efter sin klass. En konstruktör är en metod, definierad i klassen den gäller. Java-konstruktörer kan använda överbelastning för att tillhandahålla alternativt beteende. Konstruktörer i Java kan också använda arv för att återanvända kod.
Varför behöver du ändå konstruktörer?
Konstruktörer är en grundpelare i objektorienterad programmeringoch Java är inget undantag. Det här exemplet visar hur du kan definiera en grundläggande cirkelklass med en dataegenskap och en metod:
public class Circle {
allmän dubbelradie;
offentligt dubbelområde () {returnera 3.14159 * radie * radie; }
}
Du kan sedan skapa en instans av den här klassen och interagera med den:
Cirkel c = ny cirkel ();
c.radie = 2;
System.out.println (c.area ()); // 12.56636
Men det här är mindre bekvämt och robust än det kan vara. Det är bra objektorienterad praxis att inkapsla data och skydda dem från obehörig åtkomst:
public class Circle {
privat dubbel radie;
offentligt dubbelområde () {returnera 3.14159 * radie * radie; }
public void setRadius (dubbel r) {radius = r; }
}
Nu kan ringkoden använda setRadius metod och behöver inte oroa sig för detaljer om dess implementering:
Cirkel c = ny cirkel ();
c.setRadius (2);
Konstruktörer erbjuder ett ännu bättre sätt att leverera data till ett objekt när du skapar det. De används ofta för initialisering av egenskaper, till exempel radie här.
Exempel på enkla konstruktörer
Den mest grundläggande konstruktören är en utan argument, det gör ingenting:
public class Circle {
public Circle () {}
}
Se även: Lär dig hur du skapar klasser i Java
Om du inte definierar en konstruktör, kommer Java att tillhandahålla en standard som fungerar på samma sätt.
Observera ett par saker:
- Namnet på konstruktören matchar klassnamnet.
- Denna konstruktör använder offentlig åtkomstmodifierare, så alla andra koder kan kalla det.
- En konstruktör inkluderar inte en returtyp. Till skillnad från andra metoder kan konstruktörer inte returnera ett värde.
Konstruktörer utför vanligtvis någon form av initialisering. Observera att ovanstående kod inte initialiserar radiusvärdet. I det här fallet sätter språket det automatiskt till noll. Denna klass förväntar sig att en användare ska använda setRadius (). För att använda en mer användbar standard än 0 kan du tilldela den inom konstruktören:
public class Circle {
public Circle () {radius = 1; }
}
Cirklar som skapats med den här klassen kommer åtminstone nu att ha ett verkligt område! Den som ringer kan fortfarande använda setRadius () för att ge en annan radie än 1. Men konstruktören kan vara ännu vänligare:
public class Circle {
public Circle (dubbel r) {radie = r; }
}
Nu kan du skapa cirklar med en specifik radie redan från födseln:
Cirkel c = ny cirkel (2);
System.out.println (c.area ()); // 12.56636
Detta är en mycket vanlig användning för konstruktörer. Du använder dem ofta för att initiera variabler till parametervärden.
Konstruktör överbelastning
Du kan ange mer än en konstruktör i en klassdefinition:
public Circle () {radius = 1; }
public Circle (dubbel r) {radie = r; }
Detta ger telefonkoden ett val av hur man konstruerar objekt:
Cirkel c1 = ny cirkel (2);
Cirkel c2 = ny cirkel ();
System.out.println (c1.area () + "," + c2.area ()); // 12.56636, 3.14159
Med en lite mer komplex cirkel kan du utforska mer intressanta konstruktörer. Denna version lagrar sin position:
public class Circle {
allmän dubbel x, y, radie;
public Circle () {radius = r; }
public Circle (dubbel r) {radie = r; }
public Circle (dubbel x, dubbel y, dubbel r) {
this.x = x; this.y = y; radie = r;
}
offentligt dubbelområde () {returnera 3.14159 * radie * radie; }
}
Du kan nu skapa en cirkel utan argument, en enda radie eller x- och y-koordinaterna bredvid radien. Detta är samma typ av överbelastning som Java stöder för alla metoder.
Constructor Chaining
Vad sägs om att skapa en cirkel, baserad på en annan? Detta skulle ge oss möjligheten att enkelt kopiera cirklar. Följ följande block:
public Circle (Circle c) {
this.x = c.x;
this.y = c.y;
denna.radie = c.radie;
}
Detta kommer att fungera, men det upprepar viss kod i onödan. Eftersom Circle-klassen redan har en konstruktör som hanterar de enskilda egenskaperna kan du ringa det istället med detta nyckelord:
public Circle (Circle c) {
detta (c.x, c.y, c.radius);
}
Detta är en form av konstruktorkedjning, som kallar en konstruktör från en annan. Den använder mindre kod och hjälper till att centralisera en operation snarare än att duplicera den.
Ringer till föräldrakonstruktören
Den andra formen av konstruktorkedjning inträffar när en konstruktör anropar en konstruktör i sin överordnade klass. Detta kan vara antingen uttryckligt eller implicit. För att ringa en överordnad konstruktör uttryckligen använder du super nyckelord:
super (x, y);
Tänk dig en formklass som fungerar som cirkelns förälder:
offentlig klassform {
dubbel x, y;
offentlig form (dubbel _x, dubbel _y) {x = _x; y = _y; }
}
Det hanterar gemensam positionering för alla former eftersom det är funktionalitet som alla delar. Nu kan Circle-klassen delegera positionshantering till sin förälder:
offentlig klass Circle förlänger form {
dubbel radie;
public Circle (dubbel r) {super (0, 0); radie = r; }
public Circle (dubbel x, dubbel y, dubbel r) {
super (x, y);
radie = r;
}
}
Superklasskonstruktion är en mycket viktig aspekt av arv i Java. Språket tillämpar det som standard om du inte uttryckligen ringer super i dina konstruktörer.
Åtkomstmodifierare på konstruktörer
Konstruktörer kan inkludera en åtkomstmodifierare i sin signatur. Liksom andra metoder definierar detta vilka typer av uppringare som kan komma åt konstruktören:
offentligt klassprov {
privat statiskt test uniqueInstance = nytt test ();
privat test () {}
public static Test getInstance () {
return unikInstance;
}
}
Detta är ett mer komplicerat exempel, så var noga med att förstå det:
- Klassen är inte abstrakt, så det är möjligt att starta från den.
- Konstruktören är privat så att endast den här klassen själv kan skapa en ny instans.
- Via en statisk egenskap och metod exponerar klassen en enda unik instans av sig själv för uppringare.
Använd konstruktörer i Java för att skapa objekt
Konstruktörer är viktiga för objektorienterad programmering. De låter dig skapa objekt, vilket är viktigt!
I Java ser konstruktörer ut som andra metoder och fungerar på ungefär samma sätt. Du bör komma ihåg de speciella reglerna kring standardkonstruktörer, överbelastning och konstruktionskedjning. Om konstruktörer är nya för dig kanske du vill läsa om de andra Java-kärnkoncepten du bör lära dig när du börjar.
Oavsett om du skriver ett GUI, utvecklar mjukvaran på serversidan eller en mobilapplikation med Android, kommer lärande av Java att fungera bra för dig. Här är några grundläggande Java-koncept som hjälper dig att komma igång.
Läs Nästa
- Programmering
- Java
- Kodningstips
Bobby är en teknikentusiast som arbetat som mjukvaruutvecklare under mer än två decennier. Han brinner för spel, arbetar som Recensentredaktör på Switch Player Magazine och är nedsänkt i alla aspekter av onlinepublicering och webbutveckling.
Prenumerera på vårt nyhetsbrev
Gå med i vårt nyhetsbrev för tekniska tips, recensioner, gratis e-böcker och exklusiva erbjudanden!
Ett steg till…!
Bekräfta din e-postadress i e-postmeddelandet som vi just skickade till dig.