Kotlin上手教程一、构造函数

构造函数

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
发布了58 篇原创文章 · 获赞 16 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/dingshuhong_/article/details/103562239