一、init初始化代码块
/**
* DESC : init初始化代码块
*/
class KtBaseClassTest06(name : String ,age : Int) {
companion object {
const val TAG = "KtBaseClassTest06"
}
/**
* init代码块不是java中的static{}
* 而是相当于java中的 {} 代码块,主构造函数实例化之后才会调用到init代码块
*
* 主构造函数的临时参数输入类型只能在init代码块直接使用,要不就是var varName = name接收后使用
*/
init {
//主构造函数的init初始化代码块调用了==>name=张三, age=19
Log.d(TAG, "主构造函数的init初始化代码块调用了==>name="+name+", age="+age)
/**
* 对临时参数判断
* 1.如果require(true) {此错误代码不会执行,不会报错},
* 2.如果require(false) {走错误代码,会抛异常}
*/
require(name.isNotBlank()) {
//如果为空,会走这里,并且抛出异常Caused by: java.lang.IllegalArgumentException: 1
Log.d(TAG, "name=${name}")
}
require(age > 0) {
//如果age <=0,会抛出异常Caused by: java.lang.IllegalArgumentException: 1
Log.d(TAG, "年龄不符合,异常抛出")
}
}
/**
* 次构造函数调用的时候,会先调用主构造函数的init代码块
* 执行结果如下:
* 主构造函数的init初始化代码块调用了==>name=李四, age=18
* 次构造函数调用==>name=李四, age=18, sex=M
*/
constructor(name: String, age : Int, sex : Char) : this(name, age) {
Log.d(TAG, "次构造函数调用==>name=${name}, age=${age}, sex=${sex}")
}
}
二、初始化顺序,包含init测试
/**
* DESC : 初始化顺序,包含init测试
* 初始化顺序说明:类成员和init{}代码块是同时执行的,只不过按照顺序生成
*/
//第一步:先生成val age: Int
class KtBaseClassTest07(_name : String, val age : Int) {
companion object {
const val TAG = "KtBaseClassTest07"
}
/**
* 第二步,生成name变量,犹豫name赋值是在init{}代码块前面,所以先生成
* 其实name和init{}代码块是同时执行的,只不过按顺序输出
*/
var name = _name
init {
//第三步,生成tempName变量
val tempName = _name
Log.d(TAG, "init==>tempName="+tempName + ", age="+age)
}
constructor(_name : String, _age: Int, _sex : Char) : this(_name, _age) {
Log.d(TAG, "次构造函数调用_name=${_name}, _age=${_age}, _sex=${_sex}")
}
//第四步,生成info变量
var info = "hello lanny"
fun showInfo() {
Log.d(TAG, "info=${info}")
}
}










网友评论