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()аркылуу делегат кылышы керек.
Инициализациянын тартиби:
- Негизги конструктордун коду аткарылат (эгер бар болсо).
initблоктору алардын жарыялануу тартибинде аткарылат.- Экинчи конструктордун коду аткарылат (эгер колдонулса).
Мисал:
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 блокторун колдонуу инициализация логикасы үчүн, жана экинчи конструкторлордо делегаттоо объекттердин түзүлүшүнүн туруктуулугун камсыз кылуу үчүн ачык түрдө жүргүзүлөт.