Kotlin-Klasse – Kotlin-Konstruktor

In diesem Tutorial werden wir die Konzepte der objektorientierten Programmierung in Kotlin diskutieren. Wir werden die Kotlin-Klasse im Detail besprechen. Wir werden uns auch Kotlin-Konstruktoren, Zugriffsmodifizierer und abstrakte Klasse ansehen.

Kotlin-Klasse

Eine Klasse ist eine definierte Blaupause, die Funktionen und Eigenschaften gruppiert. Klassen in Kotlin werden mit dem Schlüsselwort class gefolgt vom Klassennamen definiert. Der Körper der Klasse befindet sich in geschweiften Klammern.

class FirstClass {
}

Eine Instanz der Klasse wird auf folgende Weise instanziiert:

val firstClass =  FirstClass()
var new = FirstClass() //here new is the name of the var.

Im Gegensatz zu Java ist new kein Schlüsselwort in Kotlin. Klassen sind standardmäßig final in Kotlin. Daher würde die entsprechende Definition in Java ungefähr so aussehen:

public final class FirstClass {
}

Daher sind Klassen in Kotlin standardmäßig nicht vererbbar. Um eine Klasse nicht-final zu machen, müssen wir das Schlüsselwort open hinzufügen.

open class Me{
}

Die Annotation open ermöglicht es anderen, von dieser Klasse zu erben.

Beispiel für eine Kotlin-Klasse

Lassen Sie uns eine Klasse mit einigen Funktionen und einer Eigenschaft erstellen. Wir werden sehen, wie auf die Funktionen und Eigenschaften dieser Klasse zugegriffen wird. Darüber hinaus werden wir sehen, wie die Member-Eigenschaften gesetzt werden können.

class User {

    var loggedIn: Boolean = false
    val cantChangeValue = "Hi"
    
    fun logOn() {
        loggedIn = true
    }
    
    fun logOff() {
        loggedIn = false
    }
}

fun main(args: Array<String>) {

    val user = User()
    println(user.loggedIn) //false
    user.logOn()
    println(user.loggedIn) //true
    user.logOff()
    println(user.loggedIn) //false
    user.cantChangeValue = "Hey" //won't compile. Can't modify a final variable.

}

Die Funktion main gehört zur Klasse Test.kt. Um auf Mitglieder und Funktionen zuzugreifen, müssen wir den Punktoperator verwenden. Eine val-Eigenschaft kann nicht erneut mit einem Punktoperator gesetzt werden.

Kotlin init

Der Kotlin-Init-Block ist wie folgt definiert.

class User {
    
    init{
        print("Class instance is initialised.")
    }

    var loggedIn: Boolean = false
    val cantChangeValue = "Hi"

    fun logOn() {
        loggedIn = true
    }

    fun logOff() {
        loggedIn = false
    }
}

Der Code innerhalb des init-Blocks wird als Erstes ausgeführt, wenn die Klasse instanziiert wird. Der init-Block wird jedes Mal ausgeführt, wenn die Klasse instanziiert wird, unabhängig vom verwendeten Konstruktor, wie wir als Nächstes sehen werden. Mehrere Initialisierungsblöcke können in einer Klasse geschrieben werden. Sie werden wie unten gezeigt sequentiell ausgeführt.

class MultiInit(name: String) {

    init {
        println("First initializer block that prints ${name}")
    }

    init {
        println("Second initializer block that prints ${name.length}")
    }
}

fun main(args: Array) {
    var multiInit = MultiInit("Kotlin")
}

//Das folgende wird im Log-Konsole gedruckt.
//Erster Initialisierungsblock, der Kotlin druckt
//Zweiter Initialisierungsblock, der 6 druckt

In Kotlin-Klassen können Eigenschaften bereits in der Deklaration gedruckt werden, indem die Funktion also wie unten gezeigt verwendet wird.

class MultiInit(name: String) {
    val firstProperty = "First property: $name".also(::println)

    init {
        println("First initializer block that prints ${name}")
    }

    val secondProperty = "Second property: ${name.length}".also(::println)

    init {
        println("Second initializer block that prints ${name.length}")
    }
}

fun main(args: Array) {

    var multiInit = MultiInit("Kotlin")
}

//Das folgende wird gedruckt.
//Erste Eigenschaft: Kotlin
//Erster Initialisierungsblock, der Kotlin druckt
//Zweite Eigenschaft: 6
//Zweiter Initialisierungsblock, der 6 druckt

Kotlin Konstruktor

Kotlin Konstruktoren sind spezielle Member-Funktionen, die verwendet werden, um Eigenschaften zu initialisieren. Konstruktoren in Kotlin werden im Vergleich zu Java anders geschrieben und strukturiert. Standardmäßig hat eine Klasse einen leeren Konstruktor wie unten gezeigt:

class Student {
    var name: String
    val age : Int

    init {
        name = "Anupam"
        age = 24
    }

    init {
        name = "Anupam Chugh"
        //age = 26
    }
}

fun main(args: Array) {
    
    val student = Student()
    println("${student.name} age is ${student.age}")
    student.name = "Your"
    //student.age = 26 //wird nicht kompilieren. age ist val
    println("${student.name} age is ${student.age}")

}

//Folgendes wird auf der Konsole ausgegeben:
//Anupam Chugh Alter ist 24
//Dein Alter ist 24

Primärkonstruktoren

Primärkonstruktoren in Kotlin werden direkt im Klassenheader definiert, wie unten gezeigt.

class User(var name: String, var isAdmin: Boolean) {

    init {
        name = name + " @ JournalDev.com"
        println("Author Name is $name. Is Admin? $isAdmin")
    }
}

Die Definition des Primärkonstruktors erfolgt im Klassenheader. Wir haben die Eigenschaftstypen (val/var) im Konstruktor selbst definiert. Hinweis: Sofern nicht als var angegeben, sind Konstruktorargumente standardmäßig val.

class User(name: String, isAdmin: Boolean)

In dem obigen Code können sowohl name als auch isAdmin nicht neu zugewiesen werden. Alternativ können wir die Konstruktorargumente auch den Member-Eigenschaften in der Klasse zuweisen, wie unten gezeigt.

class User(name: String, val isAdmin: Boolean) {

    var username  = name
    val _isAdmin = isAdmin

    init {
        username= username + " @ JournalDev.com"
        println("Author Name is $name. Is Admin? $_isAdmin")
    }
}

fun main(args: Array) {

    var user = User("Anupam",false)
    user.isAdmin = true //won't compile since isAdmin is val
    user._isAdmin = true //won't compile. Same reason.
    user = User("Pankaj",true)
}

//Folgendes wird im Log-Konsolenfenster ausgegeben.
//Autorname ist Anupam. Ist Administrator? falsch
//Autorname ist Pankaj. Ist Administrator? wahr

Kotlin Konstruktor Standardwerte

Kotlin ermöglicht es uns, Standardwerte im Konstruktor selbst anzugeben, wie unten gezeigt.

class User(name: String, var website: String = "JournalDev") {

    init {
        println("Author $name writes at $website")
    }

    init {
        website = website + ".com"
        println("Author $name writes at $website")
    }
}

fun main(args: Array) {

    var user = User("Anupam","JournalDev")
    user = User("Pankaj","JournalDev")
}

//Folgendes wird auf der Konsole ausgegeben:
//Autor Anupam schreibt auf JournalDev
//Autor Anupam schreibt auf JournalDev.com
//Autor Pankaj schreibt auf JournalDev
//Autor Pankaj schreibt auf JournalDev.com

Sekundäre Konstruktoren

Sekundäre Konstruktoren werden innerhalb des Körper der Klasse geschrieben und mit dem Schlüsselwort constructor versehen. Das folgende Beispiel zeigt dasselbe.

class Student {
    var name: String
    val age : Int

    constructor(name: String, age: Int)
    {
        this.name = name
        this.age = age
    }

    fun printDetails()
    {
        println("Name is $name and Age is $age")
    }

}

fun main(args: Array) {

    var student = Student("Anupam", 24)
    student.printDetails()
}

//Folgendes wird in der Konsole ausgegeben:
//Name ist Anupam und Alter ist 24

Die häufigste Verwendung von sekundären Konstruktoren erfolgt in Unterklassen, wenn Sie die Klasse auf unterschiedliche Weisen initialisieren müssen. Wenn die Klasse einen primären Konstruktor enthält, muss der sekundäre Konstruktor in seiner Deklaration darauf Bezug nehmen. Die Deklaration erfolgt unter Verwendung des Schlüsselworts this.

class Student(var name: String, val age: Int) {

    var skill: String

    init {
        skill = "NA"
    }

    constructor(name: String, age: Int, skill: String) : this(name, age) {
        this.skill = skill
    }

    fun printDetails() {
        if (skill.equals("NA"))
            println("Name is $name and Age is $age")
        else
            println("Name is $name and Age is $age Skill is $skill")
    }
}

//Folgendes wird im Log-Konsole ausgegeben:
//Name ist Anupam und Alter ist 24
//Name ist Anupam und Alter ist 24 Skill is Kotlin

init-Block wird verwendet, um die Member-Eigenschaft skill zu initialisieren. Der sekundäre Konstruktor delegiert den Primärkonstruktor unter Verwendung von : this.

Benutzerdefinierte Getter und Setter

Bisher haben wir Eigenschaften in einer Klasse mithilfe des Punktoperators auf der Instanz der Klasse zugegriffen und geändert. Lassen Sie uns die Syntax von set und get verwenden, um zu sehen, wie wir den Zugriff anpassen können.

class Name{
    var post: String = "default"
    set(value) {if(!post.isNotEmpty()) {
        throw IllegalArgumentException(" Enter a valid name")
    }
                field = value
                print(value)
    }

}

fun main(args: Array<String>) {

    var name = Name()
    name.post = "Kotlin Classes"
    name.post = ""
    name.post = "Kotlin Data Classes Our Next Tutorial"


}

Im Protokollfenster wird Folgendes ausgegeben:

Kotlin Classes

Exception in thread "main" java.lang.IllegalArgumentException:  Enter a valid name
	at Name.setPost(Test.kt:16)
	at TestKt.main(Test.kt:78)

Die Variable field im Setter speichert den älteren Wert. Fügen wir einen Getter hinzu.

class Name{
    var post: String = "default"
    set(value) {if(!post.isNotEmpty()) {
        throw IllegalArgumentException(" Enter a valid name")
    }
                field = value
    }
    get() {
        return field.capitalize()
    }

}

fun main(args: Array) {

    var name = Name()
    name.post = "kotlin classes"
    println(name.post)
    name.post = "kotlin data Classes our next Tutorial"
    println(name.post)

}

//Folgendes wird ausgegeben:
//Kotlin-Klassen
//Kotlin-Datanklassen unser nächstes Tutorial

capitalize() Großbuchstaben am Anfang des Strings. Hinweis: Wenn die Eigenschaft ein val ist, wird die set-Methode nicht kompiliert.

Sichtbarkeitsmodifikator in Kotlin

  • Öffentlich: Jede Klasse, Funktion, Eigenschaft, Schnittstelle oder Objekt, das diesen Modifikator hat, ist sichtbar und kann von überall aus zugegriffen werden.
  • Privat: Eine mit diesem Modifier definierte Klasse/Funktion kann nur in derselben Datei aufgerufen werden. Ein Mitglied/Eigenschaft in einer Klasse/Funktion mit diesem Modifier kann nur innerhalb dieses Blocks aufgerufen werden.
  • Geschützt: Dieser Modifier ist dasselbe wie „private“, außer dass er Sichtbarkeit und Zugriff in Unterklassen ermöglicht.
  • Intern: Eine Klasse/Schnittstelle/Funktion mit diesem Modifier ist nur innerhalb des gleichen Moduls zugänglich.

Sichtbarkeitsmodifier sind auch auf Konstruktoren anwendbar. Einem primären Konstruktor einen Modifier zuzuweisen erfordert, dass wir das Schlüsselwort constructor zusammen mit dem Konstruktor im Klassenheader angeben.

class Student private constructor (var name: String, val age: Int) {

    var skill: String

    init {
        skill = "NA"
    }

    constructor(name: String, age: Int, skill: String) : this(name, age) {
        this.skill = skill
    }

    fun printDetails() {
        if (skill.equals("NA"))
            println("Name is $name and Age is $age")
        else
            println("Name is $name and Age is $age Skill is $skill")
    }
}

fun main(args: Array) {

    var student = Student("Anupam",24,"Kotlin")
    student.printDetails()
}

//prints
//Name ist Anupam und Alter ist 24. Fähigkeit ist Kotlin

Private Konstruktoren können außerhalb der Klasse nicht aufgerufen werden. Im obigen Code können wir die Klasse nur in einer anderen Funktion mithilfe des sekundären Konstruktors instanziieren.

Kotlin abstrakte Klasse

Wie in Java wird das Schlüsselwort abstract verwendet, um abstrakte Klassen in Kotlin zu deklarieren. Eine abstrakte Klasse kann nicht instanziiert werden. Sie kann jedoch von Unterklassen geerbt werden. Standardmäßig sind die Mitglieder einer abstrakten Klasse nicht abstrakt, es sei denn, es wird anders angegeben.

abstract class Person(name: String) {

    init {
        println("Abstract Class. init block. Person name is $name")
    }

    abstract fun displayAge()
}

class Teacher(name: String): Person(name) {

    var age : Int

    init {
        age = 24
    }

    override fun displayAge() {
        println("Non-abstract class displayAge function overridden. Age is $age")
    }
}

fun main(args: Array) {

    val person = Teacher("Anupam")
    person.displayAge()

}

//Folgendes wird in der Konsole gedruckt.
//Abstrakte Klasse. Initialisierungsblock. Name der Person ist Anupam
//Nicht abstrakte Klasse. Alter ist 24

Hinweis: Abstrakte Klassen sind standardmäßig open. Daher ist es nicht erforderlich, einen open-Modifizierer hinzuzufügen, um die Unterklassenerstellung zu ermöglichen. Das Schlüsselwort override wird verwendet, um eine Methode in der Unterklasse zu überschreiben. In diesem Tutorial haben wir die Grundlagen von Kotlin-Klassen behandelt. Es gibt noch viel mehr, wie Datenklassen, versiegelte Klassen, Vererbung usw. Wir werden sie in den kommenden Tutorials behandeln. Referenzen: Kotlin Docs

Source:
https://www.digitalocean.com/community/tutorials/kotlin-class-constructor