Kotlin Konstruktor (Sinf/Class)

Konstruktor - bu sinf obyekti birinchi navbatda o'zgaruvchilar yoki xususiyatlarni ishga tushirish uchun yaratilganda chaqiriladigan maxsus a'zo funktsiyasi. Sinfda konstruktor bo'lishi kerak va agar biz konstruktorni e'lon qilmasak, kompilyator standart konstruktorni yaratadi.

Kotlin ikki turdagi konstruktorlarga ega: 

  1. Asosiy konstruktor
  2. Ikkilamchi konstruktor  

Kotlindagi sinf ko'pi bilan bitta asosiy konstruktorga va bir yoki bir nechta ikkinchi darajali konstruktorga ega bo'lishi mumkin. Birlamchi konstruktor sinfni ishga tushiradi, ikkinchi darajali konstruktor esa sinfni ishga tushirish va qo'shimcha mantiqni kiritish uchun ishlatiladi.

Asosiy konstruktor

Birlamchi konstruktor sinf sarlavhasida ishga tushiriladi, konstruktor kalit so'zidan foydalanib, sinf nomidan keyin keladi. Parametrlar asosiy konstruktorda ixtiyoriy.

class Add constructor(val a: Int, val b: Int) {
     // kodlar
}

Konstruktor kalit so'zini izohlar yoki kirish modifikatorlari ko'rsatilmagan bo'lsa, o'tkazib yuborish mumkin.

class Add(val a: Int, val b: Int) {
     // kodlar
}

Boshlang'ich konstruktorning Kotlin dasturi 

fun main(args: Array<String>)
{
    val add = Add(5, 6)
    println("Ikki raqamning yig'indisi: ${add.c}")
}
class Add constructor(a: Int,b:Int)
{
    var c = a+b;
}
Ikki raqamning yig'indisi: 11

Izoh: Biz sinf uchun add obyektini yaratganimizda, 5 va 6 qiymatlari konstruktorga o'tadi. Konstruktor parametrlari a va b mos ravishda 5 va 6 parametrlari bilan ishga tushiriladi. Mahalliy o'zgaruvchi c o'zgaruvchilar yig'indisini o'z ichiga oladi. Asosiysi, biz ${add.c} yordamida konstruktor xususiyatiga kiramiz.

Boshlovchi blokli asosiy konstruktor

Birlamchi konstruktor hech qanday kodni o'z ichiga olmaydi, ishga tushirish kodi init kalit so'zi bilan prefikslangan alohida initsializator blokiga joylashtirilishi mumkin.

Boshlovchi blokli birlamchi konstruktorning Kotlin dasturi 

init bloki nima? 

U a'zo o'zgaruvchilar ishga tushiriladigan boshlang'ich blok vazifasini bajaradi. Bu sinfning namunasi yaratilganda bu blok bajariladi. Bir nechta init bloklari bo'lishi mumkin va ular sinf ichida yozilgan tartibda chaqiriladi.

Eslatma: init bloklari ushbu sinf konstruktori chaqirilishidan oldin chaqiriladi.
fun main(args: Array<String>) {
    val person = Person("Uzbekdevs")
}
class Person {
    constructor(name : String){
        println("Bu birinchi boshlang'ich blok")
    } 
    init{
        println("Bu ikkinchi boshlang'ich blok")
    } 
    init{
        println("Bu uchinchi boshlang'ich blok")
    }  
    init{
        println("Bu asosiy konstruktor")
    }     
}
Bu birinchi blok Bu ikkinchi boshlang'ich blok Bu uchinchi boshlang'ich blok Bu asosiy konstruktor

Izoh: Shaxs klassi uchun obyekt shaxsi yaratilganda, "Uzbekdevs" qiymati konstruktor parametrlari nomiga o'tadi. Sinf id va nomda ikkita xususiyat e'lon qilinadi. Initializer bloki obyektni yaratish vaqtida bajariladi va nafaqat xususiyatlarni ishga tushiradi, balki standart chiqishga ham chop etadi.

Asosiy konstruktordagi standart qiymat

Funktsiyalardagi funksiyalarning standart qiymatlariga o'xshab, biz konstruktor parametrlarini ba'zi bir standart qiymatlar bilan ishga tushirishimiz mumkin.

Birlamchi konstruktorda standart qiymatlarning Kotlin dasturi 

fun main(args: Array<String>) {
    val emp = employee(18018, "Uzbekdevs")
    val emp2 = employee(11011)
    val emp3 = employee()
}
class employee(emp_id : Int = 100 , emp_name: String = "abc") {
    val id: Int
    var name: String
     init {
        id = emp_id
        name = emp_name
        print("Xodim identifikatori: $id, ")
        println("Xodimning ismi: $name")
        println()
    }
}
Xodim identifikatori: 18018, Xodimning ismi: Sherzod Xodim identifikatori: 11011, Xodimning ismi: abc Xodim identifikatori: 100, Xodimning ismi: abc

Izoh: Bu yerda biz konstruktor parametrlarini ba'zi bir sukut bo'yicha emp_id = 100 va emp_name = "abc" bilan ishga tushirdik. Obyekt emp yaratilganda biz ikkala parametr uchun qiymatlarni o'tkazdik, shuning uchun u ushbu qiymatlarni chop etadi. Biroq, emp2 obyektini yaratish vaqtida biz emp_name dan o'tmaganmiz, shuning uchun initsializer bloki standart qiymatlardan foydalanadi va standart chiqishga chop etadi. 

Ikkilamchi konstruktor

Yuqorida aytib o'tilganidek, Kotlin bir yoki bir nechta ikkinchi darajali konstruktorlarga ega bo'lishi mumkin. Ikkilamchi konstruktorlar o'zgaruvchilarni ishga tushirishga imkon beradi va sinfga mantiqiy ma'lumotlarni taqdim etishga imkon beradi. Ular konstruktor kalit so'zi bilan prefikslangan.

Ikkilamchi konstruktorni amalga oshirish uchun Kotlin dasturi   

fun main(args: Array<String>)
{
    Add(5, 6)
}
class Add
{
    constructor(a: Int, b:Int)
    {
        var c = a + b
        println("5 va 6 raqamlarining yig'indisi: ${c}")
    }
}
5 va 6 raqamlari yig'indisi: 11

Qaysi ikkilamchi konstruktor chaqirilishini kompilyator qabul qilingan argumentlar asosida hal qiladi. Yuqoridagi dasturda biz qaysi konstruktor va kompilyatorning o'zi qaror qilishini chaqirishni belgilamaymiz.

Sinfdagi ikkita ikkinchi darajali konstruktorlarning Kotlin dasturi  

fun main(args: Array<String>) {
    employee(18018, "Sherzod")
    employee(11011,"Uzbekdevs",600000.5)
}
class employee {
      constructor (emp_id : Int, emp_name: String ) {
          var id: Int = emp_id
          var name: String = emp_name
          print("Xodim identifikatori: $id, ")
          println("Xodimning ismi: $name")
          println()
      }
 
       constructor (emp_id : Int, emp_name: String ,emp_salary : Double) {
           var id: Int = emp_id
           var name: String = emp_name
           var salary : Double = emp_salary
           print("Xodim identifikatori: $id, ")
           print("Xodimning ismi: $name, ")
           println("Xodimning ismi: $salary")
       }
}
Xodim identifikatori: 18018, Xodimning ismi: Sherzod Xodim identifikatori: 11011, Xodimning ismi: Uzbekdevs Xodimning ismi: 600000.5

Bir sinfdagi uchta ikkinchi darajali konstruktorning Kotlin dasturi

fun main(args: Array<String>)
{
    Add(5, 6)
    Add(5, 6, 7)
    Add(5, 6, 7, 8)
}
class Add
{
    constructor(a: Int, b: Int)
    {
        var c = a + b
        println("5+6 = ${c}")
    }
    constructor(a: Int, b: Int, c: Int)
    {
        var d = a + b + c
        println("5+6+7 = ${d}")
    }
    constructor(a: Int, b: Int, c: Int, d: Int)
    {
        var e = a + b + c + d
        println("5+6+7+8 = ${e}")
    }
}
5+6 = 11 5+6+7 = 18 5+6+7+8 = 26

Bir ikkinchi darajali konstruktorni boshqasidan chaqirish

Ikkilamchi konstruktor this() funksiyasidan foydalanib, xuddi shu sinfdagi boshqa ikkinchi darajali konstruktorni chaqirishi mumkin. Quyidagi dasturda biz this(a,b,7) yordamida boshqa konstruktorni chaqirdik, chunki bu konstruktorni chaqirish uchta parametrni talab qiladi.

Bir konstruktorni boshqasidan chaqirish uchun Kotlin dasturi  

fun main(args: Array<String>)
{
    Add(5,6)
}
class Add {
    constructor(a: Int,b:Int) : this(a,b,7) {
        var sumOfTwo = a + b
        println("5+6=$sumOfTwo")
    }
    constructor(a: Int, b: Int,c: Int) {
        var sumOfThree = a + b + c
        println("5+6+7=$sumOfThree")
    }
}
5+6+7=18 5+6=11

Bolalar sinfining ikkinchi darajali konstruktoridan ota-ona sinfining ikkinchi darajali konstruktorini chaqirish

Biz super kalit so'zdan foydalanib, ota-klassning ikkinchi darajali konstruktorini bolalar sinfidan chaqirishimiz mumkin. Quyidagi dasturda biz qo'ng'iroq qilish jarayonini ko'rsatdik. 

fun main(args: Array<String>) {
    Child(18018, "Sherzod")
}
open class Parent {
    constructor (emp_id: Int, emp_name: String, emp_salary: Double) {
        var id: Int = emp_id
        var name: String = emp_name
        var salary : Double = emp_salary
        println("Xodim identifikatori: $id")
        println("Xodimning ismi: $name")
        println("xodimning maoshi: $salary")
        println()
    }
}
class Child : Parent {
    constructor (emp_id : Int, emp_name: String):super(emp_id,emp_name,500000.55){
        var id: Int = emp_id
        var name: String = emp_name
        println("Xodimning identifikatori: $id")
        println("Xodimning ismi: $name")
    }
}
Xodim identifikatori: 18018 Xodimning ismi: Sherzod Xodimlarning maoshi: 500000,55 Xodim identifikatori: 18018 Xodimning ismi: Sherzod