构造方法
参考
(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 都是成员变量
- 主构造方法只能有一个
- init代码块可以有多个
- init代码块和成员变量都是主构造方法的一部分,都是自上而下初始化
- 次构造方法可以有多个,如果有主构造此时次构造方法必须直接或间接的调用主构造方法
- 可以只有次构造方法,没有主构造方法
- 主次构造方法都没有时,编译器生成默认无参的一个主构造方法
- 如果子类继承父类,且父类显示的定义了构造方法,那么子类必须也要显示的定义一个构造方法并调用父类的一个构造方法来初始化父类
1.1 Kotlin以constructor命名构造函数,Java以类名命名构造函数;
1.2 Kotlin构造可以没有方法体(花括号),Java必须得有(花括号);
1.3 Kotlin init代码块可以做常规初始化处理,Java需要自定义类似init方法并主动调用;
Kotlin-构造函数以及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