/**
* 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")
}
以下是执行结果: