Middle
Was sind die Besonderheiten bei der Arbeit mit Konstruktoren und der Initialisierung von Objekten in Kotlin?
sobes.tech KI
Antwort von AI
In Kotlin können Klassen einen primären Konstruktor und einen oder mehrere sekundäre Konstruktoren haben.
Primärer Konstruktor:
- Wird in der Klassendeklaration angegeben:
class User(val name: String, var age: Int = 0) { // Klassenkörper } - Hat keinen Körper. Initialisierungscode wird in
init-Blöcken ausgeführt. - Eigenschaften, die im primären Konstruktor mit
valodervardeklariert werden, werden zu Eigenschaften der Klasse. - Konstruktorparameter können in
init-Blöcken und bei der Initialisierung von Eigenschaften verwendet werden:init { println("Benutzerinitialisierung $name") } val description = "Benutzer: $name, Alter: $age" - Wenn der primäre Konstruktor keine Anmerkungen oder Sichtbarkeitsmodifikatoren hat, kann das Schlüsselwort
constructorweggelassen werden.
init-Blöcke:
- Enthalten Initialisierungscode, der beim Erstellen einer Instanz der Klasse ausgeführt wird.
- Werden in der Reihenfolge ausgeführt, in der sie im Code erscheinen.
- Werden nach dem Aufruf des primären Konstruktors (falls vorhanden), aber vor sekundären Konstruktoren ausgeführt.
Sekundäre Konstruktoren:
- Werden mit dem Schlüsselwort
constructordeklariert. - Können den Aufruf zu einem anderen Konstruktor der Klasse mit
this()oder zum Basiskonstruktor mitsuper()delegieren. Der Delegierungsaufruf muss die erste Anweisung sein.class User(val name: String) { constructor(name: String, age: Int) : this(name) { println("Sekundärer Konstruktor") // Zusätzliche Initialisierungslogik } } - Wenn die Klasse einen primären Konstruktor hat, müssen alle sekundären Konstruktoren explizit oder implizit an ihn delegieren, meist mit
this().
Initialisierungsreihenfolge:
- Ausführung des Codes im primären Konstruktor (falls vorhanden).
- Ausführung der
init-Blöcke in der Reihenfolge ihrer Deklaration. - Ausführung des Codes im sekundären Konstruktor (falls verwendet).
Beispiel:
class Example(name: String) {
init {
println("Erster init-Block für $name")
}
val property1 = "Eigenschaft 1"
init {
println("Zweiter init-Block für $name")
}
constructor(name: String, age: Int) : this(name) {
println("Sekundärer Konstruktor für $name, Alter $age")
}
}
fun main() {
val ex1 = Example("Benutzer1") // Gibt aus: Erster init-Block für Benutzer1, Zweiter init-Block für Benutzer1
val ex2 = Example("Benutzer2", 30) // Gibt aus: Erster init-Block für Benutzer2, Zweiter init-Block für Benutzer2, Sekundärer Konstruktor für Benutzer2, Alter 30
}
Wesentliche Merkmale: deklarative Syntax für den primären Konstruktor, Verwendung von init-Blöcken für Initialisierungslogik, explizite Delegierung bei sekundären Konstruktoren zur Konsistenz bei der Objekterstellung.