Классы и конструкторы
Учимся описывать собственные типы данных через классы.
Класс — шаблон, описывающий состояние (свойства) и поведение (методы) объектов определённого вида.
Класс позволяет создать собственный тип: например, 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.