Kotlin学习笔记之类的声明和初始化

197 阅读2分钟
/**
 * Described by xj on 2021/2/5 13:33
 * Description :  类的使用
 * 1、每个类都有一个共同的超类Any
 * 2、默认情况下,类都是终类,是不能被继承的,要使类能被继承, 需要用open关键字标记
 * 3、类可以有一个主构造函数,跟在类名后,关键字为constructor,如果主构造函数没有任何注解或者可见性修饰符,可以省略这个关键字
 **/
open class InitOrderDeme (name:String) :Any() {   // 同 open class InitOrderDeme constructor(name:String) :Any() {
    // 属性初始化器 Described by  on 2021/3/6 9:54
    val firstProperty = "第一个属性定义,first property: $name".also {
        println(it)
    }
    // 主构造函数中不能包含任何代码,初始化的代码可以放到以init为关键字的初始化代码块中。
    // 初始化块中的代码会成为主构造函数的一部分。
    init {
        // 主构造函数中的参数可以在初始化代码块中使用 Described by xj on 2021/2/5 13:35
        println("第一个初始化块,this is the first init method. name is $name")
    }

    // 主构造函数中的参数可以在类体内声明的属性初始化器中使用 Described by  on 2021/2/5 13:44
    val seconsProperty = "第二个属性定义,second property: $name".also {
        println(it)
    }

    // 初始化代码块可以存在多个,在实例初始化期间,初始化块按照他们出现在类体中的顺利执行,与属性初始化器交织在一起 Described by  on 2021/2/5 13:34
    init {
        println("第二个初始化代码块,this is the second init method. name is $name")
    }

    // 1、类可以声明有前缀constructor的一个或多个次构造函数
    // 2、如果类有主构造函数,每一个次构造函数都需要委托给主构造函数
    // 3、可以直接委托也可以通过别的次构造函数间接委托,委托到同一个类的另一个构造函数用this关键字 、
    constructor(country:String,name:String):this(name){ // 通过this关键字委托给主构造函数 Described by xj on 2021/3/6 10:02
        println("第一个次构造函数,country = $country, name = $name ")
    }

    // 1、次构造函数,并将country和grade的处理委托给另一个次构造函数
    // 2、关于委托后代码的执行顺序 ->
    //                            A、先执行委托到的构造函数,再执行该构造函数。
    //                            B、因为初始化代码块是主构造函数的一部分,this委托语句是次构造函数的第一条语句,因此属性初始化器和初始化块中的代码都会在次构造函数之前执行
    //                            C、即使没有主构造函数,这种委托仍会存在,并且仍会执行初始化块
    constructor(country: String,grade:String,name:String):this(country, name){
        println("第二个次构造函数,grade = $grade")
    }

    //构造函数补充:
    // 如果一个非抽象类没有声明任何主或者次构造函数,他会有一个生成的不带任何参数的主构造函数,构造函数的可见性是public。
    // 如果你不希望你的类有一个共有的构造函数,你需要声明一个带有非默认可见性的空的主构造函数 class DontCreateMe private constructor () { /*……*/ }

}

fun main(){
    //以下是使用一个主构造函数以及两个次构造函数的对象初始化方式
    println("**********************主构造函数初始化**********************")
    InitOrderDeme("China")

    println("**********************第一个次构造函数初始化**********************")
    InitOrderDeme("China","一级")

    println("**********************第二个次构造函数初始化**********************")
    InitOrderDeme("China","一级","Tom")
}

以下是执行结果:

image.png