Классы и конструкторы

Учимся описывать собственные типы данных через классы.

Класс — шаблон, описывающий состояние (свойства) и поведение (методы) объектов определённого вида.

Класс позволяет создать собственный тип: например, User или Account. В Kotlin объявление класса максимально компактно — конструктор и свойства часто пишут в одну строку.

Первичный конструктор

Параметры конструктора указывают сразу после имени класса. Если перед параметром стоит val или var, он становится свойством объекта.

class User(val name: String, var age: Int)

fun main() {
    val u = User("Аня", 25)
    println(u.name)
    u.age = 26
    println(u.age)
}

Вывод:

Аня
26

Методы и блок init

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

class Counter(start: Int) {
    var value = start
        private set

    init {
        println("Создан счётчик со значением $value")
    }

    fun increment() {
        value++
    }
}

fun main() {
    val c = Counter(10)
    c.increment()
    println(c.value)
}

Вывод:

Создан счётчик со значением 10
11

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

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

class Point(val x: Int = 0, val y: Int = 0)

fun main() {
    val origin = Point()
    val p = Point(3, 4)
    println("${origin.x},${origin.y}")
    println("${p.x},${p.y}")
}

Вывод:

0,0
3,4

Как работает под капотом

Когда вы пишете val name: String прямо в конструкторе, компилятор сам создаёт за вас приватное поле и геттер (а для var — и сеттер). Это убирает «boilerplate», который в Java занимал бы много строк. Запись private set у свойства value означает, что читать его можно отовсюду, а менять — только изнутри класса. Создавать объект через new, как в Java, не нужно — достаточно вызвать класс как функцию.

Частые ошибки

  • Писать new User(...). В Kotlin ключевого слова new нет; объект создаётся вызовом User(...).
  • Забывать val/var у параметра конструктора. Без них параметр не станет свойством и будет недоступен снаружи.
  • Класть тяжёлую логику в init. Блок выполняется при каждом создании объекта.

Итог

  • Параметры первичного конструктора пишут после имени класса.
  • val/var перед параметром делают его свойством объекта.
  • Блок init выполняется при создании объекта.
  • Объект создаётся вызовом класса без new.
Проверьте себя
1. Как создать объект класса User в Kotlin?
Anew User("Аня", 25)
BUser("Аня", 25)
CUser.create("Аня", 25)
Dmake User("Аня", 25)
2. Что делает val перед параметром первичного конструктора?
AНичего особенного
BДелает параметр свойством объекта (доступным снаружи)
CДелает параметр обязательным
DЗапрещает создавать объект
3. Когда выполняется блок init?
AПри вызове метода объекта
BПри создании объекта (в конструкторе)
CПри уничтожении объекта
DНикогда автоматически