Sobes.tech
Middle

Kotlin'da konstruktorlar va obyektlarni boshlash bilan ishlash xususiyatlari qanday?

sobes.tech AI

AIdan javob

Kotlinda, sinflar birinchi konstruktor va bir yoki bir nechta ikkinchi konstruktorlarga ega bo'lishi mumkin.

Birinchi konstruktor:

  • Sinfning sarlavhasida e'lon qilinadi:
    class User(val name: String, var age: Int = 0) {
        // sinfning tanasi
    }
    
  • Tana emas. Initsializatsiya kodi init bloklarida bajariladi.
  • val yoki var bilan e'lon qilingan xususiyatlar sinf xususiyatlariga aylanadi.
  • Konstruktor parametrlaridan init bloklarida va xususiyatlarni initsializatsiya qilishda foydalanish mumkin:
    init {
        println("Foydalanuvchi boshlanishi $name")
    }
    
    val description = "Foydalanuvchi: $name, yosh: $age"
    
  • Agar birinchi konstruktor hech qanday annotatsiya yoki ko'rinish modifikatoriga ega bo'lmasa, constructor so'zi o'tkazib yuborilishi mumkin.

init bloklari:

  • Sinf nusxasini yaratishda bajariladigan boshlang'ich kodlarni o'z ichiga oladi.
  • Ular sinfda e'lon qilingan tartibda bajariladi.
  • Birinchi konstruktor chaqirilgandan so'ng (agar mavjud bo'lsa), ammo ikkilamchi konstruktorlardan oldin bajariladi.

Ikkinchi konstruktorlar:

  • constructor so'zi bilan e'lon qilinadi.
  • this() yordamida o'z sinfidagi boshqa konstruktor chaqiruviga yoki super() yordamida asosiy sinf konstruktoriga delegatsiya qilish mumkin. Delegatsiya chaqiruvi birinchi bo'lishi kerak.
    class User(val name: String) {
        constructor(name: String, age: Int) : this(name) {
            println("Ikkinchi konstruktor")
            // qo'shimcha boshlang'ich logika
        }
    }
    
  • Agar sinfda birinchi konstruktor bo'lsa, barcha ikkinchi konstruktorlar uni aniq yoki noaniq tarzda this() yordamida delegatsiya qilishi kerak.

Boshlanish tartibi:

  1. Birinchi konstruktor kodining bajarilishi (agar mavjud bo'lsa).
  2. init bloklarining bajarilishi.
  3. Ikkinchi konstruktor kodining bajarilishi (agar ishlatilsa).

Misol:

class Example(name: String) {
    init {
        println("$name uchun birinchi init bloki")
    }

    val property1 = "Xususiyat 1"

    init {
        println("$name uchun ikkinchi init bloki")
    }

    constructor(name: String, age: Int) : this(name) {
        println("$name uchun ikkinchi konstruktor, yosh: $age")
    }
}

fun main() {
    val ex1 = Example("Foydalanuvchi1") // Chiqish: $name uchun birinchi init bloki, $name uchun ikkinchi init bloki
    val ex2 = Example("Foydalanuvchi2", 30) // Chiqish: $name uchun birinchi init bloki, $name uchun ikkinchi init bloki, ikkinchi konstruktor, yosh 30
}

Asosiy xususiyatlar: birinchi konstruktor uchun deklarativ sintaksis, init bloklaridan foydalanish, ikkinchi konstruktorlarda aniq delegatsiya, obyektlarni yaratishda izchillikni ta'minlaydi.