Kotlin в IntelliJ IDEA Kotlin змінні Kotlin типи даних Kotlin операції з числами Kotlin умовні вирази Kotlin умовні конструкції Kotlin цикли Kotlin послідовності Kotlin масиви Kotlin функціональне програмування Kotlin змінна кількість параметрів. Vararg Kotlin повернення результату. оператор return Kotlin однорядкові і локальні функції Kotlin перевантаження функцій Kotlin Лямбда-вирази Kotlin функції вищого порядку Kotlin Анонімні функції Kotlin ООП Класи і об'єкти Kotlin ООП властивості Kotlin ООП конструктор Kotlin ООП функції в класах Kotlin ООП Пакети та імпорт Kotlin ООП модифікатори видимості Kotlin ООП вкладені класи Kotlin ООП інтерфейси Kotlin ООП спадкування Kotlin ООП Перевизначення методів і властивостей Kotlin ООП Абстрактні класи та методи Kotlin ООП Data-класи Kotlin ООП перерахування enums Kotlin ООП Null і nullable-типи Kotlin ООП Обробка винятків Kotlin ООП перетворення типів Kotlin ООП Інфіксна функція Kotlin ООП функції розширення Kotlin ООП Узагальнені класи і функції Kotlin ООП обмеження узагальнень Kotlin ООП Варіантність, коваріантність і контраваріантність Kotlin Колекції. Змінювані і незмінні колекції Kotlin Колекції. LIST список Kotlin Колекції. Set Kotlin Колекції. Map

Kotlin ООП конструктор


Для створення об'єкта необхідно викликати конструктор класу. За замовчуванням компілятор створює конструктор, який не приймає параметрів і який ми можемо використовувати. Але також ми можемо визначати свої власні конструктори. Для визначення конструкторів застосовується ключове слово constructor .

Класи в Kotlin можуть мати один первинний конструктор (primary constructor) і один або кілька вторинних конструкторів (secondary constructor).


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

Первинний конструктор є частиною заголовка класу і визначається відразу після імені класу:

class Person constructor(_name: String){
    
}

Конструктори, як і звичайні функції, можуть мати параметри. Так, в даному випадку конструктор має параметр _name , який представляє тип String. Через параметри конструктора ми можемо передати ззовні дані і використовувати їх для ініціалізації об'єкта. При цьому первинний конструктор на відміну від функцій не визначає ніяких дій, він тільки може приймати дані ззовні через параметри.

Якщо первинний конструктор не має ніяких анотацій або модифікаторів доступу, як в даному випадку, то ключове слово constructor можна опустити:

class Person(_name: String){
    
}

ініціалізатор

Що робити з отриманими через конструктор даними? Ми їх можемо використовувати для ініціалізації властивостей класу. Для цього застосовуються блоки ініціалізаторів:

class Person(_name: String){
    val name: String
    init{
        name = _name
    }
}

У класі Person визначено властивість name, яке зберігає ім'я людини. Щоб передати цю властивості значення параметра _name з первинного конструктора, застосовується блок ініціалізатор. Блок ініціалізатор визначається після ключового слова init .

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

Тепер ми можемо використовувати первинний конструктор класу для створення об'єкта:

fun main(args: Array<String>) {
    val tom: Person = Person("Tom")
    val bob: Person = Person("Bob")
    val alice: Person = Person("Alice")
     
    println(tom.name)   // Tom
    println(bob.name)   // Bob
    println(alice.name) // Alice
}
 
class Person(_name: String){
    val name: String
    init{
        name = _name
    }
}

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


Первинний конструктор і властивості

Первинний конструктор також може використовуватися для визначення властивостей:

fun main(args: Array<String>) {
 
    val bob: Person = Person("Bob", 23)
 
    println("Name: ${bob.name}  Age: ${bob.age}")
}
 
class Person(val name: String, val age: Int){
 
}

Властивості визначаються як і параметри, при цьому їх визначення починається з ключового слова val . І в цьому випадку нам вже необов'язково явно визначати ці властивості в тілі класу, так як їх вже визначає конструктор. І при виклику конструктора цим властивостям автоматично передаються значення: Person("Bob", 23)


вторинні конструктори

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

Вторинні конструктори визначаються в тілі класу. Якщо для класу визначено первинний конструктор, то вторинний конструктор повинен викликати первинний за допомогою ключового слова this :

class Person(_name: String){
    val name: String
    var age: Int = 0
    init{
        name = _name
    }
    constructor(_name: String, _age: Int) : this(_name){
        age = _age
    }
}

Тут в клас Person додано властивість age, яке зберігає вік людини. І також доданий вторинний конструктор. Він приймає два параметри: _name і _age. За допомогою ключового слова this викликається первинний конструктор, тому через цей виклик необхідно передати значення для параметрів первинного конструктора. Зокрема, в первинний конструктор передається значення параметра _name. У самому вторинному конструкторі встановлюється значення властивості age.

Таким чином, при виклику вторинного конструктора спочатку викликається первинний конструктор, спрацьовує блок ініціалізатор, який встановлює властивість name. Потім виконуються власне дії вторинного конструктора, який встановлює властивість age.

Використовуємо цю модифікацію класу Person:

fun main(args: Array<String>) {
 
    val tom: Person = Person("Tom")
    val bob: Person = Person("Bob", 45)
     
    println("Name: ${tom.name}  Age: ${tom.age}")
    println("Name: ${bob.name}  Age: ${bob.age}")
}
 
class Person(_name: String){
    val name: String
    var age: Int = 0
    init{
        name = _name
    }
    constructor(_name: String, _age: Int) : this(_name){
        age = _age
    }
}

У функції main створюються два об'єкти Person. Для створення об'єкта tom застосовується первинний конструктор, який приймає один параметр. Для створення об'єкта bob застосовується вторинний конструктор з двома параметрами.

Консольний висновок програми:

Ім'я: Tom Вік: 0
Ім'я: Bob Вік: 45

Наш партнер:
beta test mp3 playlist downloader