В чем разница между блоком инициализации и конструктором в kotln?
Я начал изучать Kotlin. Я хотел бы знать разницу между init
блок и constructor
, В чем разница между этим и как мы можем использовать это для улучшения?
class Person constructor(var name: String, var age: Int){
var profession: String = "test"
init{
println("Test")
}
}
4 ответа
Блок init будет выполняться сразу после основного конструктора. Блоки инициализатора эффективно становятся частью основного конструктора. Конструктор является вторичным конструктором. Делегирование первичному конструктору происходит как первый оператор вторичного конструктора, поэтому код во всех блоках инициализатора выполняется перед телом вторичного конструктора.
пример
class Sample(private var s : String) {
constructor(t: String, u: String) : this(t) {
this.s += "$u"
}
init {
s += "B"
}
}
Думаю, вы инициализировали класс Sample
Sample("T","U")
Вы получите строковый ответ в переменной s как "TBU"
, Значение "T"
присваивается s из первичного конструктора класса Sample, а затем сразу начинает выполняться блок init, добавит "B"
к переменной. После того, как блок инициализации начинает выполнять блок вторичного конструктора, и s становится "TBU"
,
Поскольку,
Основной конструктор не может содержать никакого кода.
https://kotlinlang.org/docs/reference/classes.html
Блоки init позволяют добавлять код в основной конструктор.
Класс в классе Kotlin - первичный конструктор (тот, что после имени класса), который не содержит код, он может только инициализировать свойства (например, class X(var prop: String)
).
init{..}
блок в том месте, где вы можете поместить больше кода, который будет запускаться после инициализации свойств:
Блоки инициализатора выполняются в том же порядке, в каком они появляются в теле класса, чередуясь с инициализаторами свойств.
Подробнее об этом читайте в https://kotlinlang.org/docs/reference/classes.html.
Вот пример:
class X(var b: String) {
val a = print("a")
init {
print("b")
}
constructor() : this("aaa") {
print("c")
}
}
X()
Когда называется это печатает abc
, Таким образом init{..}
in вызывается после первичного конструктора, но перед вторичным.
Как указано в документах Kotlin:
Основной конструктор не может содержать никакого кода . Код инициализации может быть помещен в блоки инициализатора с префиксом
init
ключевое слово.
Во время инициализации экземпляра блоки инициализатора выполняются в том же порядке, что и в теле класса , чередующиеся с инициализаторами свойств: ...