11-bo‘lim

Sinflar va obyektlar

Asosiy konstruktor, init bloki, ikkilamchi konstruktorlar, o'z getter va setteringiz, backing field va ko'rinish darajalari.

🕑 13 daqiqa o‘qish 📄 619 so‘z 👁 0 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Eng qisqa sinf
  2. val va var farqi
  3. init bloki
  4. Tanadagi xossalar
  5. O'z getter va setteringiz
  6. Ikkilamchi konstruktorlar
  7. toString, equals va hashCode
  8. Ko'rinish darajalari
  9. this
  10. Obyekt - havola turi
  11. Xulosa

Sinf - o'z ma'lumoti va xatti-harakatiga ega yangi tur. Kotlin da uni e'lon qilish juda qisqa.

Eng qisqa sinf #

KOTLIN
class Talaba(val ism: String, var ball: Int)

fun main() {
    val t = Talaba("Malika", 88)

    println(t.ism)
    println(t.ball)

    t.ball = 95
    println(t.ball)
}
Natija
Malika
88
95

Bitta qator. Qavs ichidagi qism - asosiy konstruktor, va u yerdagi val/var bir vaqtning o'zida:

  1. Konstruktor parametrini,
  2. Sinf xossasini,
  3. Ularni bog'lovchi kodni

birdaniga e'lon qiladi.

Java bilan solishtiring

Java da xuddi shu sinf uchun maydonlar, konstruktor, to'rtta get/set metodi - qirqqa yaqin qator kerak bo'lardi.

Kotlin ning asosiy maqsadlaridan biri aynan shu: ortiqcha kodni yo'q qilish. Yozilmagan kodda xato ham bo'lmaydi.

val va var farqi #

KOTLIN
class Kitob(val nom: String, var narx: Int)

fun main() {
    val k = Kitob("O'tkan kunlar", 45000)

    k.narx = 50000
    println("${k.nom} - ${k.narx}")
}
Natija
O'tkan kunlar - 50000

val xossaga tashqaridan qiymat berib bo'lmaydi - faqat o'qiladi.

init bloki #

KOTLIN
class Doira(val radius: Double) {
    val yuza: Double
    val uzunlik: Double

    init {
        require(radius > 0) { "Radius musbat bo'lishi kerak" }
        yuza = Math.PI * radius * radius
        uzunlik = 2 * Math.PI * radius
    }
}

fun main() {
    val d = Doira(3.0)
    println("%.2f".format(d.yuza))
    println("%.2f".format(d.uzunlik))

    try {
        Doira(-1.0)
    } catch (e: IllegalArgumentException) {
        println("Xato: ${e.message}")
    }
}
Natija
28.27
18.85
Xato: Radius musbat bo'lishi kerak

init - obyekt yaratilayotganda bajariladigan kod. require esa shart bajarilmasa IllegalArgumentException ko'taradi - tekshirish uchun qulay qisqartma.

Tanadagi xossalar #

KOTLIN
class Hisob(val egasi: String, boshlangich: Int) {
    var qoldiq = boshlangich
        private set

    val ochilganYil = 2026

    fun qoshish(summa: Int) {
        if (summa > 0) qoldiq += summa
    }

    fun yechish(summa: Int): Boolean {
        if (summa > qoldiq) return false
        qoldiq -= summa
        return true
    }
}

fun main() {
    val h = Hisob("Husanboy", 500000)

    h.qoshish(250000)
    println(h.qoldiq)

    println(h.yechish(100000))
    println(h.yechish(9000000))
    println(h.qoldiq)
}
Natija
750000
true
false
650000

Diqqat: boshlangich parametrida val yo'q - u xossa emas, shunchaki konstruktor parametri. Uni faqat init va xossa e'lonlarida ishlatish mumkin.

private set - o'qish ochiq, yozish yopiq

var qoldiq ostidagi private set - eng foydali shakllardan biri.

Tashqaridan h.qoldiq ni o'qish mumkin, lekin h.qoldiq = -999 deb yozish mumkin emas. Qiymat faqat sinf ichidagi metodlar orqali, qoidalar tekshirilgan holda o'zgaradi.

Bu inkapsulyatsiyaning eng qisqa ko'rinishi.

O'z getter va setteringiz #

KOTLIN
class Odam(val ism: String, val familiya: String) {
    val toliqIsm: String
        get() = "$familiya $ism"

    var yosh: Int = 0
        set(qiymat) {
            field = if (qiymat < 0) 0 else qiymat
        }
}

fun main() {
    val o = Odam("Dilnoza", "Yusupova")
    println(o.toliqIsm)

    o.yosh = 25
    println(o.yosh)

    o.yosh = -5
    println(o.yosh)
}
Natija
Yusupova Dilnoza
25
0
  • get() bilan yozilgan xossa saqlanmaydi - u har chaqirilganda hisoblanadi.
  • set(qiymat) da field - xossaning yashirin saqlash joyi.
field o'rniga xossa nomini yozmang

Setter ichida yosh = qiymat deb yozsangiz, u o'zini o'zi chaqiradi va dastur StackOverflowError bilan to'xtaydi.

Shuning uchun Kotlin field degan maxsus nom beradi - u faqat getter va setter ichida ko'rinadi va aynan saqlash joyini bildiradi.

Ikkilamchi konstruktorlar #

KOTLIN
class Vaqt(val soat: Int, val daqiqa: Int) {
    constructor(soat: Int) : this(soat, 0)

    constructor(matn: String) : this(
        matn.split(":")[0].toInt(),
        matn.split(":")[1].toInt()
    )

    override fun toString() = "%02d:%02d".format(soat, daqiqa)
}

fun main() {
    println(Vaqt(10, 30))
    println(Vaqt(9))
    println(Vaqt("14:45"))
}
Natija
10:30
09:00
14:45

: this(...) - asosiy konstruktorni chaqirish. Har bir ikkilamchi konstruktor oxir-oqibat asosiysiga borishi shart.

Ikkilamchi konstruktor kam kerak

Ko'p hollarda standart argumentlar yetarli:

KOTLIN
class Vaqt(val soat: Int, val daqiqa: Int = 0)

Bu yuqoridagi birinchi ikkilamchi konstruktorning o'rnini bosadi va qisqaroq.

Ikkilamchi konstruktor faqat mantiq boshqacha bo'lganda kerak - masalan satrdan tahlil qilish.

toString, equals va hashCode #

KOTLIN
class Nuqta(val x: Int, val y: Int) {
    override fun toString() = "($x, $y)"

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (other !is Nuqta) return false
        return x == other.x && y == other.y
    }

    override fun hashCode() = 31 * x + y
}

fun main() {
    val a = Nuqta(3, 7)
    val b = Nuqta(3, 7)

    println(a)
    println(a == b)
    println(a === b)
    println(setOf(a, b).size)
}
Natija
(3, 7)
true
false
1

Bu uchtasini qo'lda yozish zerikarli. Keyingi bo'limda data class buni bir so'z bilan hal qilishini ko'ramiz.

Ko'rinish darajalari #

KOTLIN
class Hisoblagich {
    private var soni = 0
    internal val nomi = "asosiy"

    fun oshir() {
        soni++
        yozib_ol()
    }

    private fun yozib_ol() {
        println("Hozirgi qiymat: $soni")
    }

    fun qiymat() = soni
}

fun main() {
    val h = Hisoblagich()
    h.oshir()
    h.oshir()
    println(h.qiymat())
    println(h.nomi)
}
Natija
Hozirgi qiymat: 1
Hozirgi qiymat: 2
2
asosiy
DarajaKim ko'radi
publicHamma (standart - yozish shart emas)
privateFaqat shu sinf (yoki shu fayl)
protectedShu sinf va vorislari
internalShu modul ichida

Kotlin da standart holat public - Java dagi "paket ichida" emas.

this #

KOTLIN
class Talaba(val ism: String) {
    var ball: Int = 0

    fun ballQoy(ball: Int): Talaba {
        this.ball = ball
        return this
    }

    fun korsat(): Talaba {
        println("$ism: $ball")
        return this
    }
}

fun main() {
    Talaba("Aziza").ballQoy(95).korsat()

    val t = Talaba("Malika")
    t.ballQoy(88).korsat()
}
Natija
Aziza: 95
Malika: 88

this - joriy obyekt. Parametr va xossa nomi bir xil bo'lganda shart. return this esa zanjirli chaqiruvga imkon beradi.

Obyekt - havola turi #

KOTLIN
class Quti(var ichi: String)

fun main() {
    val a = Quti("olma")
    val b = a

    b.ichi = "anor"

    println(a.ichi)
    println(b.ichi)
    println(a === b)
}
Natija
anor
anor
true
b = a nusxa yaratmaydi

Ikkala nom ham bitta obyektga ishora qiladi. b orqali o'zgartirsangiz, a ham o'zgaradi.

Haqiqiy nusxa kerak bo'lsa, uni o'zingiz yasashingiz kerak - yoki data class ning copy() metodidan foydalaning (keyingi bo'lim).

Amaliy topshiriq
  1. Kitob sinfini yarating: nom, muallif, yil.
  2. val xossaga qiymat berishga urinib, xatoni o'qing.
  3. init blokida tekshiruv qo'ying va require ni sinang.
  4. private set bilan faqat o'qiladigan xossa yarating.
  5. get() bilan hisoblanadigan xossa yozing.
  6. Setter ichida field o'rniga xossa nomini yozib ko'ring.
  7. Ikkilamchi konstruktor qo'shing va this(...) bilan bog'lang.
  8. O'sha ishni standart argument bilan qayta yozing.
  9. toString ni qayta yozib, println(obyekt) ni sinang.
  10. Ikkita o'zgaruvchi bitta obyektga ishora qilishini isbotlang.

Xulosa #

  • class Talaba(val ism: String, var ball: Int) - konstruktor va xossalar bitta qatorda.
  • init bloki obyekt yaratilayotganda ishlaydi; require shart tekshiradi.
  • Konstruktorda val/var yozilmasa, parametr xossa bo'lmaydi.
  • private set - o'qish ochiq, yozish yopiq.
  • get() bilan xossa hisoblanadi, saqlanmaydi.
  • Setter ichida field yoziladi, xossa nomi emas.
  • Ikkilamchi konstruktor o'rniga ko'pincha standart argument yetadi.
  • Kotlin da standart ko'rinish - public.
  • Obyekt havola turi: b = a nusxa yaratmaydi.

Keyingi bo'limda data class, object va companion ni ko'ramiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.