11-bo‘lim
Sinflar va obyektlar
Asosiy konstruktor, init bloki, ikkilamchi konstruktorlar, o'z getter va setteringiz, backing field va ko'rinish darajalari.
Ushbu bo‘lim mundarijasi
Sinf - o'z ma'lumoti va xatti-harakatiga ega yangi tur. Kotlin da uni e'lon qilish juda qisqa.
Eng qisqa sinf #
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)
}
Malika
88
95
Bitta qator. Qavs ichidagi qism - asosiy konstruktor, va u yerdagi
val/var bir vaqtning o'zida:
- Konstruktor parametrini,
- Sinf xossasini,
- Ularni bog'lovchi kodni
birdaniga e'lon qiladi.
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 #
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}")
}
O'tkan kunlar - 50000
val xossaga tashqaridan qiymat berib bo'lmaydi - faqat o'qiladi.
init bloki #
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}")
}
}
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 #
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)
}
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.
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 #
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)
}
Yusupova Dilnoza
25
0
get()bilan yozilgan xossa saqlanmaydi - u har chaqirilganda hisoblanadi.set(qiymat)dafield- xossaning yashirin saqlash joyi.
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 #
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"))
}
10:30
09:00
14:45
: this(...) - asosiy konstruktorni chaqirish. Har bir ikkilamchi
konstruktor oxir-oqibat asosiysiga borishi shart.
Ko'p hollarda standart argumentlar yetarli:
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 #
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)
}
(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 #
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)
}
Hozirgi qiymat: 1
Hozirgi qiymat: 2
2
asosiy
| Daraja | Kim ko'radi |
|---|---|
public | Hamma (standart - yozish shart emas) |
private | Faqat shu sinf (yoki shu fayl) |
protected | Shu sinf va vorislari |
internal | Shu modul ichida |
Kotlin da standart holat public - Java dagi "paket ichida"
emas.
this #
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()
}
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 #
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)
}
anor
anor
true
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).
Kitobsinfini yarating: nom, muallif, yil.valxossaga qiymat berishga urinib, xatoni o'qing.initblokida tekshiruv qo'ying varequireni sinang.private setbilan faqat o'qiladigan xossa yarating.get()bilan hisoblanadigan xossa yozing.- Setter ichida
fieldo'rniga xossa nomini yozib ko'ring. - Ikkilamchi konstruktor qo'shing va
this(...)bilan bog'lang. - O'sha ishni standart argument bilan qayta yozing.
toStringni qayta yozib,println(obyekt)ni sinang.- Ikkita o'zgaruvchi bitta obyektga ishora qilishini isbotlang.
Xulosa #
class Talaba(val ism: String, var ball: Int)- konstruktor va xossalar bitta qatorda.initbloki obyekt yaratilayotganda ishlaydi;requireshart tekshiradi.- Konstruktorda
val/varyozilmasa, parametr xossa bo'lmaydi. private set- o'qish ochiq, yozish yopiq.get()bilan xossa hisoblanadi, saqlanmaydi.- Setter ichida
fieldyoziladi, xossa nomi emas. - Ikkilamchi konstruktor o'rniga ko'pincha standart argument yetadi.
- Kotlin da standart ko'rinish -
public. - Obyekt havola turi:
b = anusxa yaratmaydi.
Keyingi bo'limda data class, object va companion ni ko'ramiz.
O‘qish tarixini saqlamoqchimisiz?
Tizimga kirsangiz, tugatgan bo‘limlaringiz saqlanadi va qoldirgan joyingizdan davom etasiz.
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.