Middle
Mik a Kotlinban a konstruktorokkal és az objektumok inicializálásával kapcsolatos jellemzők?
sobes.tech MI
Válasz az MI-től
Kotlinban az osztályoknak lehet elsődleges konstruktoruk és egy vagy több másodlagos konstruktoruk.
Elsődleges konstruktor:
- Az osztály fejlécében van deklarálva:
class User(val name: String, var age: Int = 0) { // az osztály törzse } - Nincs törzse. Az inicializáló kód az
initblokkokban fut le. - Az
valvagyvar-rel deklarált tulajdonságok az osztály tulajdonságaivá válnak. - A konstruktor paramétereit az
initblokkokban és a tulajdonságok inicializálásakor lehet használni:init { println("Felhasználó inicializálása $name") } val description = "Felhasználó: $name, életkor: $age" - Ha az elsődleges konstruktor nem tartalmaz annotációkat vagy láthatósági módosítókat, a
constructorkulcsszó elhagyható.
init blokkok:
- Olyan inicializációs kódokat tartalmaznak, amelyek a példányosítás során futnak.
- A deklaráció sorrendjében hajtódnak végre.
- A primér konstruktor hívása után (ha van), de a másodlagos konstruktorok előtt futnak.
Másodlagos konstruktorok:
- A
constructorkulcsszóval vannak deklarálva. - Delegálhatnak más konstruktorhívásra ugyanabban az osztályban a
this()segítségével vagy a szülőosztály konstruktorára asuper()-rel. A delegációs hívásnak az első utasításnak kell lennie.class User(val name: String) { constructor(name: String, age: Int) : this(name) { println("Másodlagos konstruktor") // kiegészítő inicializációs logika } } - Ha az osztálynak van elsődleges konstruktora, minden másodlagos konstruktor explicit vagy implicit módon delegáljon hozzá a
this()segítségével.
Inicializálási sorrend:
- A primer konstruktor kódjának végrehajtása (ha van).
- Az
initblokkok végrehajtása a deklaráció sorrendjében. - A másodlagos konstruktor kódjának végrehajtása (ha használják).
Példa:
class Example(name: String) {
init {
println("Első init blokk $name számára")
}
val property1 = "Tulajdonság 1"
init {
println("Második init blokk $name számára")
}
constructor(name: String, age: Int) : this(name) {
println("Másodlagos konstruktor $name számára, életkor $age")
}
}
fun main() {
val ex1 = Example("Felhasználó1") // Kiírja: Első init blokk Felhasználó1, Második init blokk Felhasználó1
val ex2 = Example("Felhasználó2", 30) // Kiírja: Első init blokk Felhasználó2, Második init blokk Felhasználó2, Másodlagos konstruktor Felhasználó2, életkor 30
}
Fő jellemzők: deklaratív szintaxis az elsődleges konstruktorhoz, az init blokkok használata az inicializálási logikához, az explicit delegáció a másodlagos konstruktorokban az objektumok létrehozásának konzisztenciáját biztosítja.