Класс Kotlin – Kotlin Конструктор

В этом уроке мы будем обсуждать концепции Объектно-Ориентированного Программирования на языке Kotlin. Мы подробно рассмотрим класс Kotlin. Мы также рассмотрим конструкторы Kotlin, модификаторы доступа и абстрактные классы.

Класс Kotlin

Класс – это определенный чертеж, который объединяет функции и свойства. Классы в Kotlin определяются с использованием ключевого слова class, за которым следует имя класса. Тело помещается в фигурные скобки.

class FirstClass {
}

Экземпляр класса создается следующим образом:

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

В отличие от Java, new не является ключевым словом в Kotlin. Классы по умолчанию являются final в Kotlin. Так что эквивалент вышеописанных определений на Java будет выглядеть примерно так:

public final class FirstClass {
}

Таким образом, по умолчанию классы в Kotlin не могут быть унаследованы. Чтобы сделать класс непоследовательным, нам нужно добавить ключевое слово open.

open class Me{
}

Аннотация open позволяет другим классам наследоваться от этого класса.

Пример класса Kotlin

Давайте создадим класс с несколькими функциями и свойством. Посмотрим, как обратиться к функциям и свойствам этого класса. Кроме того, мы рассмотрим, как установить свойства участника.

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.

}

Функция main принадлежит классу Test.kt. Для доступа к членам и функциям нам нужно использовать оператор точки. Свойство val нельзя устанавливать снова с использованием оператора точки.

Инициализация Kotlin

Блок инициализации Kotlin определен следующим образом.

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

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

    fun logOn() {
        loggedIn = true
    }

    fun logOff() {
        loggedIn = false
    }
}

Код внутри блока init выполняется первым при создании класса. Блок init выполняется каждый раз при создании класса с любым видом конструктора, как мы увидим далее. В классе можно написать несколько блоков инициализации. Они будут выполняться последовательно, как показано ниже.

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")
}

//Ниже выводится в консоль журнала.
//Первый блок инициализации, который выводит Kotlin
//Второй блок инициализации, который выводит 6

В классах Kotlin можно выводить свойства уже в самом объявлении, используя функцию also, как показано ниже.

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")
}

//Ниже выводится.
//Первое свойство: Kotlin
//Первый блок инициализации, который выводит Kotlin
//Второе свойство: 6
//Второй блок инициализации, который выводит 6

Конструктор Kotlin

Конструкторы в Kotlin – это особые функции-члены, используемые для инициализации свойств. Конструкторы в Kotlin написаны и структурированы по-другому по сравнению с Java. По умолчанию у класса есть пустой конструктор, как показано ниже:

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 //не скомпилируется. age - это val
    println("${student.name} age is ${student.age}")

}

//На консоли выводится следующее:
//Anupam Chugh age is 24
//Ваш возраст - 24

Основные конструкторы

Основные конструкторы в Kotlin определяются непосредственно в заголовке класса, как показано ниже.

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

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

Определение основных конструкторов размещается в заголовке класса. Мы определили типы свойств (val/var) непосредственно в конструкторе. Примечание: Если не указано как var, по умолчанию аргументы конструктора являются val.

class User(name: String, isAdmin: Boolean)

В приведенном выше коде и имя, и isAdmin не могут быть переназначены. В качестве альтернативы, мы также можем присвоить аргументы конструктора членовым свойствам в классе, как показано ниже.

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)
}

//На консоли выводится следующее:
//Имя автора - Anupam. Администратор? false
//Имя автора - Pankaj. Администратор? true

Значения по умолчанию конструктора Kotlin

Кotlin позволяет нам указывать значения по умолчанию в самом конструкторе, как показано ниже.

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")
}

//Следующее выводится в консоль:
//Автор Анупам пишет на JournalDev
//Автор Анупам пишет на JournalDev.com
//Автор Панкадж пишет на JournalDev
//Автор Панкадж пишет на JournalDev.com

Вторичные конструкторы

Вторичные конструкторы записываются внутри тела класса, добавляя перед ключевым словом constructor. Следующий пример демонстрирует это.

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()
}

//Следующее выводится в консоль:
//Имя - Анупам, Возраст - 24

Наиболее распространенное использование вторичных конструкторов происходит в подклассах, когда вам нужно инициализировать класс разными способами. Если класс содержит первичный конструктор, вторичный конструктор должен ссылаться на него в своем объявлении. Объявление делается с использованием ключевого слова 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")
    }
}

//Следующее выводится в консоль:
//Имя - Анупам, Возраст - 24
//Имя - Анупам, Возраст - 24 Skill is Kotlin

Блок `init` используется для инициализации свойства члена `skill`. Вторичный конструктор делегирует первичному конструктору с использованием `: this`.

Пользовательские геттеры и сеттеры

До сих пор мы обращались к свойствам в классе и модифицировали их, используя оператор точки на экземпляре класса. Давайте используем синтаксис `set` и `get`, чтобы посмотреть, как мы можем настроить доступ.

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"


}

В журнале консоли печатается следующее:

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)

Переменная `field` в сеттере сохраняет старое значение. Добавим геттер.

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)

}

//Выводится следующее:
//Классы Kotlin
//Kotlin data классы наш следующий урок

Метод `capitalize()` делает первую букву строки заглавной. Примечание: если свойство является `val`, метод `set` не скомпилируется.

Модификатор видимости Kotlin

  • Public: Любой класс, функция, свойство, интерфейс или объект, имеющий этот модификатор, виден и может быть доступен из любого места.
  • Приватный: Класс/функция, определенная с этим модификатором, может быть доступна только в том же файле. Член/свойство в классе/функции с этим модификатором может быть доступно только внутри этого блока.
  • Защищенный: Этот модификатор аналогичен приватному, за исключением того, что он позволяет видимость и доступ в подклассах.
  • Внутренний: Класс/интерфейс/функция с этим модификатором доступен только в том же модуле.

Модификаторы видимости также применимы к конструкторам. Присваивание модификатора основному конструктору требует указания ключевого слова constructor наряду с конструктором в заголовке класса.

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
//Имя - Anupam и Возраст - 24 Навык - Kotlin

Приватные конструкторы не могут быть вызваны вне класса. В приведенном выше коде мы можем создать экземпляр класса в другой функции только с использованием вторичного конструктора.

Абстрактный класс Kotlin

Как и в Java, ключевое слово abstract используется для объявления абстрактных классов в Kotlin. Абстрактный класс не может быть создан напрямую. Однако его можно наследовать подклассами. По умолчанию члены абстрактного класса не являются абстрактными, если не указано обратное.

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()

}

//Следующее выводится в консоли.
//Абстрактный класс. Блок инициализации. Имя человека - Anupam
//Не абстрактный класс. Возраст - 24

Примечание: Абстрактные классы по умолчанию являются open. Поэтому добавление модификатора open для разрешения наследования не требуется. Ключевое слово override используется для переопределения метода в подклассе. В этом учебнике мы рассмотрели основы классов Kotlin. Есть еще много другого, такого как Data Classes, Sealed Classes, Inheritance и т. д. Мы рассмотрим их в предстоящих уроках. Ссылки: Документация Kotlin

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