Пропустити до головного контенту

Об'єкти

Щоб більше розуміти як працюють об'єкти у програмуванні, введім приклад з реального життя, наприклад, у вас є домашній вихованець. Нехай це буде кіт.

Розглянемо його як об'єкт. У нього є назва (тобто його ідентифікатор серед інших вихованців), є якісь властивості (наприклад, його ім'я та вік) та є функції (наприклад, нявкання).

Візуалізуймо нашого кота: Кіт

Властивості

Властивість, грубо кажучи, це те саме, що й змінна, тільки вона прив'язана до об'єкта.

Функції

Раніше ми розглядали, що таке функції. Єдине, що відрізняється у такому випадку - це те, що нам потрібен об'єкт (його екземпляр) щоб її викликати.

Інформація

Важливо враховувати, що область видимості змінної та/або функції обмежується об'єктом. Тобто, її видно тільки, якщо в нас є доступ до об'єкта та сам член (функція або змінна) має відповідний модифікатор видимості.

Зобразім же нашого кота нарешті на Kotlin.

Kotlin

Для того, щоб створити об'єкт в Kotlin, ми використовуємо ключове слово object:

object Cat

Наступним же словом, ми вказуємо назву об'єкта. До речі, назва об'єктів ми завжди пишемо з великої букви (тобто замість lower camel case, у нас використовується upper camel case).

Далі, йде тіло об'єкта:

object Cat { // вказуємо тіло об'єкта
// тут будуть речі, які відносяться до об'єкта
}

Вкажім властивості нашому об'єкту:

object Cat {
val name: String
val age: Int
}

Ми вказали властивості, але не задали туди ніяких даних, через що наша IDE та компілятор буде сваритись. Виправимо:

object Cat {
val name: String = "Мася"
val age: Int = 4
}

Вказування властивостей ніяк не відрізняється від будь-якого іншого місця. І до речі, теж саме з функціями:

object Cat {
val name: String = "Мася"
val age: Int = 4

fun meow(): String {
return "meow<3"
}
}

І на цьому етапі у нас вже конструювання об'єкту закінчене. Для того, щоб отримати щось з цього об'єкту робимо наступне:

fun main() {
println("Кіт ${Cat.name} віком ${Cat.age} сказав ${Cat.meow()}.")
}

Не складно, чи не так?

Додатково

Чому в цьому випадку ми використовуємо ${} для змінних? Все просто – Cat.name та ін. сприймається, як вираз, бо перша частина (Cat) не є змінною.

Потрібно знати

Ви пам'ятаєте про області видимості? Об'єкти також мають свою область видимості, але вона трішки відрізняється: члени об'єкта (функції та властивості) доступні, якщо сам об'єкт доступний.

Ось таке не буде працювати

AnotherFile.kt
private object Cat {
val name: String = "Мася"
val age: Int = 4

fun meow(): String {
return "meow<3"
}
}
Main.kt
fun main() {
println("Кіт ${Cat.name} віком ${Cat.age} сказав ${Cat.meow()}.") // Cat не доступний
}

Також не буде працювати, якщо сам член об'єкта буде private:

object Cat {
// змінна є приватною та доступна тільки в місці створення та нижче по ієрархії.
private val name: String = "Мася"
val age: Int = 4

fun meow(): String {
return "meow<3"
}
}
fun main() {
println("Кіт ${Cat.name} віком ${Cat.age} сказав ${Cat.meow()}.") // Помилка: Cannot access 'name': it is private in 'Cat'
}

До речі, а що робити, якщо у нас декілька котів? Розберемо в наступній темі.