Kotlin: Классы и объекты — полное руководство

Классы и объекты в Kotlin

Класс — это структура, описывающая поведение и возможности объектов. На основе класса создаются объекты с похожим функционалом, но разными значениями.

Создание класса

Для создания класса создайте новый Kotlin-файл (тип «Class») в папке src. Рассмотрим создание класса вручную, чтобы лучше понять ключевые слова.

Назовите файл (и класс) User. Простейший класс:

class User

Это готовый, хотя и пустой, класс. Фигурные и круглые скобки здесь не нужны.

Создание объекта

Создадим объект класса User:

val alex = User()

Это создаёт объект alex. Пока класс пуст, тестировать его нечего.

Добавление функциональности

Добавим переменные и функцию:

class User {
    var firstName: String = "Alex"
    var secondName: String = "Marley"

    fun printUser() {
        println("$firstName $secondName")
    }
}

fun main() {
    val alex = User()
    alex.firstName = "Alexander"
    alex.printUser()
}

Созданы переменные firstName и secondName типа String, им присвоены значения, и создана функция printUser() для вывода данных.

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

Изменение значений через объект неудобно. Используем конструкторы для передачи параметров:

class User(firstName: String, secondName: String) {
    var firstName: String
    var secondName: String

    init {
        this.firstName = firstName
        this.secondName = secondName
    }
}

fun main() {
    val alex = User("Alex", "Marley")
    val john = User("John", "Doe")
    println(alex.firstName)
    println(john.firstName)
}

При создании объекта передаются параметры firstName и secondName, инициализирующие переменные. Если конструктор не задан, Kotlin создаёт его по умолчанию.

Сокращение кода с init блоком

Код можно сократить, используя блок init:

class User(firstName: String, secondName: String) {
    var firstName: String = firstName
    var secondName: String = secondName
}

Параметры присваиваются переменным класса. Блок init здесь необязателен.

Сокращение кода: прямое присваивание

Ещё короче:

class User(var firstName: String, var secondName: String)

Параметры конструктора одновременно объявляют и инициализируют переменные.

Несколько конструкторов

Класс может иметь несколько конструкторов:

class User(var firstName: String = "Peter", var secondName: String = "Patrick") {
    init {
        println("Данные были установлены")
    }

    constructor(firstName: String): this(firstName, "Patrick") {
       //Дополнительный код
    }

}

fun main() {
    val user1 = User("Alex", "Marley")
    val user2 = User()
    val user3 = User("Bob")
    println(user1.firstName)
    println(user2.firstName)
    println(user3.firstName)

}

Основной конструктор задаёт значения по умолчанию, дополнительный — принимает только firstName, используя значение по умолчанию для secondName.

val и var

var — переменные, которые можно изменять, val — только для чтения:

class User(var firstName: String, var secondName: String) {
    val login: String? = null
}

login — переменная только для чтения.

Getter и Setter

Добавим getter и setter:

class User(var firstName: String, var secondName: String) {
    var login: String? = null
        set(value) {
            println("Устанавливаем значение: $value")
            field = if (value == "code") "anon" else value
        }
        get() {
            val loginField = if (field == null) "Неизвестно" else field
            println("Переменная равна: $loginField")
            return loginField
        }
}

fun main() {
    val user = User("Alex", "Marley")
    user.login = "code"
    println(user.login)
}

setter проверяет и устанавливает значение. getter выводит информацию и возвращает значение.

Модификаторы доступа

Модификаторы доступа определяют видимость:

  • public (по умолчанию): доступен отовсюду.
  • internal: доступен внутри модуля.
  • private: доступен только внутри класса.
  • protected: доступен внутри класса и его наследников (в Kotlin для классов не используется).
internal class User(var firstName: String, var secondName: String) {
    private fun printUser() {
        println("$firstName $secondName")
    }
}

printUser() имеет модификатор private и доступна только внутри класса User.

Рассмотрено создание классов и объектов в Kotlin, включая конструкторы, getter и setter, модификаторы доступа и способы инициализации переменных. Kotlin предоставляет гибкие инструменты для объектно-ориентированного программирования.

Что будем искать? Например,программа