Sobes.tech
Middle

Kotlinде конструкторлор менен объекттерди баштоо менен иштөө өзгөчөлүктөрү кандай?

sobes.tech AI

AIден жооп

Котлинде класстарда негизги конструктор жана бир нече же бир нече экинчи конструкторлор болушу мүмкүн.

Негизги конструктор:

  • Класс башында жарыяланат:
    class User(val аты: String, var жашы: Int = 0) {
        // класс денеси
    }
    
  • Тело жок. Инициализация коду init блокторунда аткарылат.
  • Негизги конструктордо val же var менен жарыяланган мүчөлөр класс мүчөлөрүнө айланат.
  • Конструктор параметрлерин init блокторунда жана мүчөлөрдү инициализациялоодо колдонсо болот:
    init {
        println("Колдонуучунун инициализациясы $аты")
    }
    
    val сүрөттөө = "Колдонуучу: $аты, жашы: $жашы"
    
  • Эгер негизги конструкторго аннотациялар же көрүүчүлүк модификаторлору жок болсо, constructor сөзүнөн кутулууга болот.

init блоктору:

  • Класс түзүлгөндө аткарылчу инициализация коду камтыйт.
  • Алар жарыяланган тартипте аткарылат.
  • Негизги конструктор чакырылган соң, бирок экинчи конструкторлордон мурда аткарылат.

Экинчи конструкторлор:

  • constructor сөзү менен жарыяланат.
  • Башка конструкторго this() же базалык класс конструкторуна super() аркылуу делегат кылышы мүмкүн. Делегат биринчи орунда болушу керек.
    class User(val аты: String) {
        constructor(аты: String, жашы: Int) : this(аты) {
            println("Экинчи конструктор")
            // кошумча инициализация логикасы
        }
    }
    
  • Эгер класс негизги конструкторго ээ болсо, бардык экинчи конструкторлор аны ачык же кыйыр түрдө this() аркылуу делегат кылышы керек.

Инициализациянын тартиби:

  1. Негизги конструктордун коду аткарылат (эгер бар болсо).
  2. init блоктору алардын жарыялануу тартибинде аткарылат.
  3. Экинчи конструктордун коду аткарылат (эгер колдонулса).

Мисал:

class Example(аты: String) {
    init {
        println("Биринчи init блогу $аты")
    }

    val өзгөчөлүк1 = "Өзгөчөлүк 1"

    init {
        println("Экинчи init блогу $аты")
    }

    constructor(аты: String, жашы: Int) : this(аты) {
        println("Экинчи конструктор $аты, жашы $жашы")
    }
}

fun main() {
    val ex1 = Example("Колдонуучу1") // Чыгуу: Биринчи init блогу Колдонуучу1, Экинчи init блогу Колдонуучу1
    val ex2 = Example("Колдонуучу2", 30) // Чыгуу: Биринчи init блогу Колдонуучу2, Экинчи init блогу Колдонуучу2, Экинчи конструктор Колдонуучу2, жашы 30
}

Негизги өзгөчөлүктөрү: декларативдүү синтаксис негизги конструктор үчүн, init блокторун колдонуу инициализация логикасы үчүн, жана экинчи конструкторлордо делегаттоо объекттердин түзүлүшүнүн туруктуулугун камсыз кылуу үчүн ачык түрдө жүргүзүлөт.