构造函数
class Person( name: String="Tom") {
constructor(age:Int) : this() {
//如果这个构造函数不传主构造的参数, 就必须手动传一个参数或者 主构造设置默认参数, 但是这里是得不到name属性,因为主构造函数最先执行
println("constructor(name: String, age: Int) ; age = $age")
}
constructor(name: String, age: Int) : this(name) {
//初始化块init 是主构造函数的一部分,即使上面的次构造函数 `: this(name)`没有委托主构造函数 他也会默认添加一个隐式的委托
println("constructor(name: String, age: Int) name = $name ; age = $age")
}
constructor(name: String, age: Int, height: Int) : this(name, age) {
//这里是三个构造函数的次构造委托两个函数的构造
println("constructor(name: String, age: Int, height: Int) name = $name ; age = $age ; height = $height")
}
init {
//初始化块其实就是 主构造的函数代码块
println("init name = $name ")
}
}
定义一个person类 打印主构造、 初始化块 以及 次构造函数之间的关系
@Test
fun testConstructor() {
var person = Person("Tom",18,170)
}
输出结果:
init name = Tom
constructor(name: String, age: Int) name = Tom ; age = 18
constructor(name: String, age: Int, height: Int) name = Tom ; age = 18 ; height = 170
构造函数 和 属性变量 以及 init 代码块 执行的顺序
open class Base(val name: String) {
init { println("Initializing Base") }
open val size: Int =
name.length.also { println("Initializing size in Base: $it") }
}
class Derived(
name: String,
val lastName: String
) : Base(name.capitalize().also { println("Argument for Base: $it") }) {
init { println("Initializing Derived") }
override val size: Int =
(super.size + lastName.length).also { println("Initializing size in Derived: $it") }
}
打印输出的日志
Constructing Derived("hello", "world")
Argument for Base: Hello
Initializing Base
Initializing size in Base: 5
Initializing Derived
Initializing size in Derived: 10