参考
(128条消息) Kotlin构造方法梳理_Axurq的博客-CSDN博客_kotlin 构造方法
Kotlin-简约之美-进阶篇(七):主构造方法和次构造方法 - 简书 (jianshu.com)
主构造方法 是声明在类名后面 不是类体
当我们定义一个类时,我们如果没有为其显式提供Primary Constructor,Kotlin编译器会默认为其生成一个无参主构造,这点和Java是一样的。 可以只有次构造方法,没有主构造方法 主构造是默认生成
主构造函数的参数加上 var 和 val 这只是声明属性以及从主构造函数初始化属性的一种简洁的语法,意思是将该变量作为类的成员变量来使用,是因为主构造函数是类头的一部分吧,在这里直接声明属性使得属性的声明变得很方便、简洁。
- class Person(private val username: String, private var age: Int){}
- 或者
- class Person(val username: String, var age: Int){}
-
- 那么user和age 都是成员变量
1.1 Kotlin以constructor命名构造函数,Java以类名命名构造函数;
1.2 Kotlin构造可以没有方法体(花括号),Java必须得有(花括号);
1.3 Kotlin init代码块可以做常规初始化处理,Java需要自定义类似init方法并主动调用;
参考
【Kotlin】Kotlin构造函数、成员变量、init代码块执行顺序_Java-考高分网 (kaotop.com)
Kotlin-构造函数以及init调用顺序 - 简书 (jianshu.com)
主构造函数 -> 声明在init之前的变量赋值 (可以赋值主构造函数里面的参数)->init块->
声明在init之后的变量赋值 (可以赋值主构造函数里面的参数)->次构造函数
其实 反编译成java 会发现 变量声明 和init 可以看成主构造函数的一部分,并且是按声明顺序copy过去的

class Gouzao(name:String, count :Int) {
protected var myname = name
init {
println("Gouzao init myname = $myname")
}
constructor(name:String, count :Int, a:Int):this(name , count){
println("Gouzao second constructor mycount = $mycount")
}
protected var mycount = count
}
Gouzao("yyy", 12,78)
打印的是结果是:
Gouzao init myname = yyy
Gouzao second constructor mycount = 12
