In diesem Artikel lernen Sie anhand von Beispielen Konstruktoren in Kotlin (sowohl primäre als auch sekundäre Konstruktoren) sowie Initialisierungsblöcke kennen.
Ein Konstruktor ist eine übersichtliche Methode zum Initialisieren von Klasseneigenschaften.
Es ist eine spezielle Elementfunktion, die aufgerufen wird, wenn ein Objekt instanziiert (erstellt) wird. Wie sie in Kotlin funktionieren, ist jedoch etwas anders.
In Kotlin gibt es zwei Konstruktoren:
- Primärkonstruktor - prägnante Methode zum Initialisieren einer Klasse
- Sekundärer Konstruktor - Ermöglicht das Einfügen zusätzlicher Initialisierungslogik
Primärkonstruktor
Der primäre Konstruktor ist Teil des Klassenkopfs. Hier ist ein Beispiel:
Klasse Person (val Vorname: String, var Alter: Int) (// Klassenkörper)
Der von Klammern umgebene Codeblock ist der primäre Konstruktor : (val firstName: String, var age: Int)
.
Der Konstruktor hat zwei Eigenschaften deklariert: firstName
(schreibgeschützte Eigenschaft, wie sie mit dem Schlüsselwort deklariert wurde val
) und age
(schreibgeschützte Eigenschaft, wie sie mit dem Schlüsselwort deklariert wurde var
).
Beispiel: Primärkonstruktor
fun main(args: Array) ( val person1 = Person("Joe", 25) println("First Name = $(person1.firstName)") println("Age = $(person1.age)") ) class Person(val firstName: String, var age: Int) ( )
Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:
Vorname = Joe Alter = 25
Wenn das Objekt der Person
Klasse erstellt wird "Joe"
und 25
Werte wie Person
eine Funktion übergeben werden.
Diese initialisiert firstName
und age
Eigenschaften von person1 Objekt auf "Joe"
und 25
ist.
Es gibt andere Möglichkeiten, Primärkonstruktoren zu verwenden.
Primärkonstruktor- und Initialisierungsblöcke
Der primäre Konstruktor hat eine eingeschränkte Syntax und kann keinen Code enthalten.
Um den Initilisierungscode (nicht nur den Code zum Initialisieren von Eigenschaften) einzufügen, wird der Initialisierungsblock verwendet. Dem init
Schlüsselwort wird ein Präfix vorangestellt . Lassen Sie uns das obige Beispiel mit dem Initialisierungsblock ändern:
fun main(args: Array) ( val person1 = Person("joe", 25) ) class Person(fName: String, personAge: Int) ( val firstName: String var age: Int // initializer block init ( firstName = fName.capitalize() age = personAge println("First Name = $firstName") println("Age = $age") ) )
Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:
First Name = Joe Age = 25
Hier Parameter fName und Persönlichkeit in der Klammer nimmt Werte "Joe"
und 25
jeweils , wenn person1 Objekt erstellt wird. FName und personAge werden jedoch ohne Verwendung von var
oder verwendet val
und sind keine Eigenschaften der Person
Klasse.
Die Person
Klasse hat zwei Eigenschaften: Vorname und Alter werden deklariert.
Wenn ein person1
Objekt erstellt wird, wird der Code im Initialisierungsblock ausgeführt. Der Initialisierungsblock initialisiert seine Eigenschaften nicht nur, sondern druckt sie auch aus.
Hier ist eine andere Möglichkeit, dieselbe Aufgabe auszuführen:
fun main(args: Array) ( val person1 = Person("joe", 25) ) class Person(fName: String, personAge: Int) ( val firstName = fName.capitalize() var age = personAge // initializer block init ( println("First Name = $firstName") println("Age = $age") ) )
Zur Unterscheidung des Konstruktorparameters und der Eigenschaft werden verschiedene Namen verwendet (fName und firstName sowie personAge und age). Es ist üblicher, _firstName und _age anstelle eines völlig anderen Namens für Konstruktorparameter zu verwenden. Beispielsweise:
Klasse Person (_firstName: String, _age: Int) (val firstName = _firstName.capitalize () var age = _age // Initialisiererblock init (…))
Standardwert im Primärkonstruktor
Sie können Konstruktorparametern einen Standardwert bereitstellen (ähnlich wie Standardargumente für Funktionen). Beispielsweise:
fun main(args: Array) ( println("person1 is instantiated") val person1 = Person("joe", 25) println("person2 is instantiated") val person2 = Person("Jack") println("person3 is instantiated") val person3 = Person() ) class Person(_firstName: String = "UNKNOWN", _age: Int = 0) ( val firstName = _firstName.capitalize() var age = _age // initializer block init ( println("First Name = $firstName") println("Age = $age") ) )
Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:
Vorname = Joe Alter = 25 Person2 wird instanziiert Vorname = Jack Alter = 0 Person3 wird instanziiert Vorname = UNBEKANNT Alter = 0
Kotlin Sekundärkonstruktor
In Kotlin kann eine Klasse auch einen oder mehrere sekundäre Konstruktoren enthalten. Sie werden mit constructor
Schlüsselwörtern erstellt.
Sekundärkonstruktoren sind in Kotlin nicht so häufig. Die häufigste Verwendung des sekundären Konstruktors tritt auf, wenn Sie eine Klasse erweitern müssen, die mehrere Konstruktoren bereitstellt, die die Klasse auf unterschiedliche Weise initialisieren. Überprüfen Sie unbedingt die Kotlin-Vererbung, bevor Sie sie lernen.
So können Sie in Kotlin einen sekundären Konstruktor erstellen:
Klasse Log (Konstruktor (Daten: String) (// etwas Code) Konstruktor (Daten: String, numberOfData: Int) (// etwas Code))
Hier hat die Log
Klasse zwei sekundäre Konstruktoren, aber keinen primären Konstruktor.
Sie können die Klasse erweitern als:
Klasse Log (Konstruktor (Daten: String) (// Code) Konstruktor (Daten: String, numberOfData: Int) (// Code)) Klasse AuthLog: Log (Konstruktor (Daten: String): super (Daten) (// Code ) Konstruktor (Daten: String, numberOfData: Int): super (Daten, numberOfData) (// Code))
Hier rufen Konstruktoren der abgeleiteten Klasse AuthLog
den entsprechenden Konstruktor der Basisklasse auf Log
. Dafür super()
wird verwendet.
In Kotlin können Sie auch einen Konstruktor von einem anderen Konstruktor derselben Klasse (wie in Java) mit aufrufen this()
.
Klasse AuthLog: Log (Konstruktor (Daten: String): dieser (Daten, 10) (// Code) Konstruktor (Daten: String, numberOfData: Int): super (Daten, numberOfData) (// Code))
Beispiel: Kotlin-Sekundärkonstruktor
fun main(args: Array) ( val p1 = AuthLog("Bad Password") ) open class Log ( var data: String = "" var numberOfData = 0 constructor(_data: String) ( ) constructor(_data: String, _numberOfData: Int) ( data = _data numberOfData = _numberOfData println("$data: $numberOfData times") ) ) class AuthLog: Log ( constructor(_data: String): this("From AuthLog -> " + _data, 10) ( ) constructor(_data: String, _numberOfData: Int): super(_data, _numberOfData) ( ) )
Wenn Sie das Programm ausführen, lautet die Ausgabe wie folgt:
Von AuthLog -> Falsches Passwort: 10 mal
Hinweis: Der sekundäre Konstruktor muss die Basisklasse initialisieren oder an einen anderen Konstruktor delegieren (wie im obigen Beispiel), wenn die Klasse keinen primären Konstruktor hat.