Was ist ein Konstruktor in Java und wie wird er verwendet?
In der objektorientierten Programmierung ist ein Konstruktor eine spezielle Funktion, die Sie aufrufen, um ein Objekt zu erstellen. Konstruktoren verfügen über mehrere einzigartige Funktionen, die es ihnen ermöglichen, zu arbeiten.
In Java benennen Sie einen Konstruktor nach seiner Klasse. Ein Konstruktor ist eine Methode, die in der Klasse definiert ist, für die sie gilt. Java-Konstruktoren können Überladungen verwenden, um alternatives Verhalten bereitzustellen. Konstruktoren in Java können auch Vererbung verwenden, um Code wiederzuverwenden.
Warum brauchen Sie überhaupt Konstrukteure?
Konstruktoren sind eine tragende Säule der objektorientierten Programmierung , und Java ist keine Ausnahme. Dieses Beispiel zeigt, wie Sie eine einfache Circle-Klasse mit einer Dateneigenschaft und einer Methode definieren können:
public class Circle {
public double radius;
public double area() { return 3.14159 * radius * radius; }
}
Sie können dann eine Instanz dieser Klasse erstellen und mit ihr interagieren:
Circle c = new Circle();
c.radius = 2;
System.out.println(c.area()); // 12.56636
Dies ist jedoch weniger bequem und robust, als es sein könnte. Es ist eine gute objektorientierte Praxis, Daten zu kapseln, um sie vor unbefugtem Zugriff zu schützen:
public class Circle {
private double radius;
public double area() { return 3.14159 * radius * radius; }
public void setRadius(double r) { radius = r; }
}
Jetzt kann der aufrufende Code die setRadius- Methode verwenden und muss sich nicht um die Implementierungsdetails kümmern:
Circle c = new Circle();
c.setRadius(2);
Konstruktoren bieten eine noch bessere Möglichkeit, ein Objekt beim Erstellen mit Daten zu versorgen. Sie werden sehr oft für die Initialisierung von Eigenschaften verwendet, wie hier der Radius .
Beispiele für einfache Konstruktoren
Der einfachste Konstruktor ist einer ohne Argumente, der nichts tut:
public class Circle {
public Circle() {}
}
Wenn Sie keinen Konstruktor definieren, stellt Java einen Standardkonstruktor bereit, der sich genauso verhält.
Beachten Sie ein paar Dinge:
- Der Name des Konstruktors stimmt mit dem Klassennamen überein.
- Dieser Konstruktor verwendet den öffentlichen Zugriffsmodifizierer, sodass jeder andere Code ihn aufrufen kann.
- Ein Konstruktor enthält keinen Rückgabetyp. Im Gegensatz zu anderen Methoden können Konstruktoren keinen Wert zurückgeben.
Konstruktoren führen normalerweise eine Art Initialisierung durch. Beachten Sie, dass der obige Code den Radiuswert nicht initialisiert. In diesem Fall wird die Sprache automatisch auf Null gesetzt. Diese Klasse erwartet, dass ein Benutzer setRadius() verwendet . Um einen nützlicheren Standard als 0 zu verwenden, können Sie ihn innerhalb des Konstruktors zuweisen:
public class Circle {
public Circle() { radius = 1; }
}
Kreise, die mit dieser Klasse erstellt wurden, haben jetzt zumindest eine tatsächliche Fläche! Der Aufrufer kann immer noch setRadius() verwenden , um einen anderen Radius als 1 bereitzustellen. Der Konstruktor kann jedoch noch freundlicher sein:
public class Circle {
public Circle(double r) { radius = r; }
}
Jetzt können Sie von Geburt an Kreise mit einem bestimmten Radius erstellen:
Circle c = new Circle(2);
System.out.println(c.area()); // 12.56636
Dies ist eine sehr häufige Verwendung für Konstrukteure. Sie werden sie häufig verwenden, um Variablen mit Parameterwerten zu initialisieren.
Konstruktor-Überladung
Sie können mehr als einen Konstruktor in einer Klassendefinition angeben:
public Circle() { radius = 1; }
public Circle(double r) { radius = r; }
Dies gibt aufrufendem Code die Wahl, wie Objekte erstellt werden sollen:
Circle c1 = new Circle(2);
Circle c2 = new Circle();
System.out.println(c1.area() + ", " + c2.area()); // 12.56636, 3.14159
Mit einem etwas komplexeren Circle können Sie interessantere Konstrukteure erkunden. Diese Version speichert ihre Position:
public class Circle {
public double x, y, radius;
public Circle() { radius = r; }
public Circle(double r) { radius = r; }
public Circle(double x, double y, double r) {
this.x = x; this.y = y; radius = r;
}
public double area() { return 3.14159 * radius * radius; }
}
Sie können jetzt einen Kreis ohne Argumente, einen einzelnen Radius oder x- und y-Koordinaten neben dem Radius erstellen. Dies ist die gleiche Art von Überladung, die Java für jede Methode unterstützt.
Konstruktorverkettung
Wie wäre es, einen Kreis basierend auf einem anderen zu erstellen? Dies würde uns die Möglichkeit geben, Kreise einfach zu kopieren. Beachten Sie den folgenden Block:
public Circle(Circle c) {
this.x = cx;
this.y = cy;
this.radius = c.radius;
}
Dies wird funktionieren, aber es wiederholt einige Codes unnötig. Da die Circle-Klasse bereits über einen Konstruktor verfügt, der die einzelnen Eigenschaften behandelt, können Sie diesen stattdessen mit dem Schlüsselwort this aufrufen:
public Circle(Circle c) {
this(cx, cy, c.radius);
}
Dies ist eine Form der Konstruktorverkettung, bei der ein Konstruktor von einem anderen aufgerufen wird. Es verwendet weniger Code und hilft, einen Vorgang zu zentralisieren, anstatt ihn zu duplizieren.
Aufruf des übergeordneten Konstruktors
Die andere Form der Konstruktorverkettung tritt auf, wenn ein Konstruktor einen Konstruktor seiner Elternklasse aufruft. Dies kann entweder explizit oder implizit sein. Um einen übergeordneten Konstruktor explizit aufzurufen, verwenden Sie das Schlüsselwort super :
super(x, y);
Stellen Sie sich eine Shape-Klasse vor, die als übergeordnetes Element des Circle fungiert:
public class Shape {
double x, y;
public Shape(double _x, double _y) { x = _x; y = _y; }
}
Es übernimmt die gemeinsame Positionierung für alle Formen, da dies die Funktionalität ist, die alle gemeinsam haben. Jetzt kann die Circle-Klasse die Positionsbehandlung an ihre übergeordnete Klasse delegieren:
public class Circle extends Shape {
double radius;
public Circle(double r) { super(0, 0); radius = r; }
public Circle(double x, double y, double r) {
super(x, y);
radius = r;
}
}
Die Superklassenkonstruktion ist ein sehr wichtiger Aspekt der Vererbung in Java . Die Sprache erzwingt es standardmäßig, wenn Sie super in Ihren Konstruktoren nicht explizit aufrufen.
Zugriffsmodifikatoren für Konstruktoren
Konstruktoren können einen Zugriffsmodifizierer in ihre Signatur aufnehmen. Wie andere Methoden definiert dies, welche Arten von Aufrufern auf den Konstruktor zugreifen können:
public class Test {
private static Test uniqueInstance = new Test();
private Test() { }
public static Test getInstance() {
return uniqueInstance;
}
}
Dies ist ein komplizierteres Beispiel, also achten Sie darauf, es zu verstehen:
- Die Klasse ist nicht abstrakt, daher ist es möglich, von ihr zu instanziieren.
- Der Konstruktor ist privat, sodass nur diese Klasse selbst eine neue Instanz erstellen kann.
- Über eine statische Eigenschaft und Methode macht die Klasse eine einzelne, eindeutige Instanz von sich selbst für Aufrufer verfügbar.
Verwenden von Konstruktoren in Java zum Erstellen von Objekten
Konstruktoren sind für die objektorientierte Programmierung von entscheidender Bedeutung. Sie ermöglichen es Ihnen, Objekte zu erstellen, was unerlässlich ist!
In Java sehen Konstruktoren aus wie andere Methoden und funktionieren ähnlich. Sie sollten sich an die Sonderregeln für Standardkonstruktoren, Überladung und Konstruktorverkettung erinnern. Wenn Konstruktoren neu für Sie sind, sollten Sie sich über die anderen grundlegenden Java-Konzepte informieren, die Sie zu Beginn lernen sollten.