Kursinhalt
Java Erweitert
Java Erweitert
Konstruktor
Wie kann die Initialisierung einer Klasse vereinfacht werden?
Das manuelle Initialisieren jedes Feldes kann umständlich sein. Für solche Zwecke verfügen Klassen über Konstruktoren. Die Syntax für einen Konstruktor ist wie folgt:
Main.java
modifier ClassName(ParameterType parameter1, ParameterType parameter2) { this.parameter1 = parameter1; this.parameter2 = parameter2; }
Im Folgenden werden die einzelnen Begriffe erläutert:
modifier
: Bezieht sich auf den Zugriffsmodifizierer, der bei Konstruktoren häufigpublic
ist. Fälle, in denen ein Konstruktor einen anderen Zugriffsmodifizierer haben kann, werden in einem separaten Kurs behandelt;ClassName
: Der Name der Klasse, in der dieser Konstruktor erstellt wird;ParameterType
: Der Typ des Parameters, der im Konstruktor verwendet wird. Hier ist besondere Aufmerksamkeit erforderlich, da dieser Parameter denselben Typ wie das Feld in der Klasse haben sollte; Beispiel: Hat die Klasse zwei Parameter,String name
undint age
, sollte der Konstruktor dieselben Parameter enthalten (wenn alle Felder über den Konstruktor initialisiert werden sollen). Möchte man nur ein bestimmtes Klassenfeld, z. B.name
, über den Konstruktor initialisieren, sollte nur ein Parameter mit demselben Typ und Namen wie das Feld in der Klasse verwendet werden;- Anschließend werden im Rumpf des Konstruktors die Werte den Klassenfeldern mithilfe der übergebenen Parameter zugewiesen.
Schlüsselwort "this"
Mit dem Schlüsselwort this
kann auf das Klassenfeld verwiesen werden, in dessen Kontext dieses Schlüsselwort verwendet wird. Wenn beispielsweise eine Klasse zwei Felder name
und age
besitzt, kann innerhalb des Konstruktors oder einer Methode this.name
geschrieben werden. Dadurch wird explizit auf das Klassenfeld und nicht auf die lokale Variable verwiesen, die als Parameter an den Konstruktor oder die Methode übergeben wurde. Auf diese Weise lassen sich die Klassenfelder im Konstruktor mit folgender Syntax initialisieren: this.name = name;
.
Beispiel
Im Folgenden ein Beispiel für einen Konstruktor in einer Klasse, der alle Felder initialisiert, um das Konzept zu verdeutlichen:
Person.java
class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } }
Wir haben eine Klasse namens Person
mit drei Feldern. Jedes dieser Felder wurde mithilfe des Schlüsselworts this
im Konstruktor hinzugefügt. Der Konstruktor initialisiert somit die Felder mit den Werten aus den Parametern. Nutzen wir diesen Konstruktor in der main
-Methode, um zu sehen, dass die Felder mit den übergebenen Parametern initialisiert werden:
Main.java
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); } }
Wir initialisierten das Person
-Objekt bob
mithilfe des Konstruktors, indem wir name
, age
und gender
als Parameter übergeben haben. Anschließend gaben wir seine Parameter auf dem Bildschirm aus und sehen, dass das Objekt die Feldwerte wie in den Konstruktorparametern angegeben besitzt.
Konstruktorüberladung
Der Konstruktor kann auch überladen werden und muss nicht die Initialisierung aller Klassenfelder abdecken. Zum Beispiel, wenn wir das Geschlecht von Alice nicht angeben möchten, können wir den Konstruktor überladen, sodass er nur 2 Parameter akzeptiert und die Felder damit initialisiert:
Main.java
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public Person(String name, int age) { this.name = name; this.age = age; } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); Person alice = new Person("Alice", 17); System.out.println("Alice's name: " + alice.name + ", Alice's age: " + alice.age); } }
Es lässt sich feststellen, dass ein Konstruktor, ähnlich wie eine Methode, überladen werden kann und unterschiedliche Anzahlen sowie Typen von Parametern akzeptieren kann.
Standardkonstruktor
Ein Standardkonstruktor ist ein Konstruktor, der keine Parameter entgegennimmt und keine Felder initialisiert. Er ist in allen Klassen standardmäßig vorhanden, sofern keine andere Art von Konstruktor definiert wurde, weshalb er als Standardkonstruktor bezeichnet wird. Jedes Mal, wenn wir ein Objekt einer Klasse erstellen, verwenden wir einen Konstruktor. Um den Standardkonstruktor zu nutzen, wenn bereits ein Konstruktor mit Parametern existiert, müssen wir zusätzlich einen leeren Konstruktor schreiben:
Main.java
package com.example; class Person { String name; int age; String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public Person(String name, int age) { this.name = name; this.age = age; } public Person() { } } public class Main { public static void main(String[] args) { Person bob = new Person("Bob", 20, "Male"); System.out.println("Bob's name: " + bob.name + ", Bob's age: " + bob.age + ", Bob's gender: " + bob.gender); Person alice = new Person("Alice", 17); System.out.println("Alice's name: " + alice.name + ", Alice's age: " + alice.age); Person john = new Person(); System.out.println("John's name: " + john.name + ", John's age: " + john.age); } }
Wir verwenden drei verschiedene Konstruktoren, um jeweils ein Person
-Objekt zu initialisieren. Wie im letzten Beispiel zu sehen ist, hat John
keinen Namen und kein Alter, da diese Felder für das Objekt nicht initialisiert wurden. Somit können wir den Konstruktor beliebig oft überladen und Objekte darüber erzeugen.
1. Welche der folgenden Aussagen über Konstruktoren ist richtig?
2. Was ist der Zweck eines Konstruktors in Java?
3. Welcher der folgenden Codeausschnitte zeigt die korrekte Erstellung eines parametrisierten Konstruktors?
Danke für Ihr Feedback!