1、类声明
class People { ... }
类声明由 class 关键字、类名、类头(指定类型参数、主构造器等)、由花括号包围的 类体 构成,其中类头和类体是可选。
class People
2、构造函数
在 Kotlin 中一个类可以有 一个主构造函数 和 多个次构造函数 。
2.1 主构造函数
主构造器是类头的一部分,在类名与可选参数后:
class People constructor (name: String) { ... }
如果主构造函数 没有任何注解或者可见性修饰符,可以省略这个 constructor
关键字,反之,constructor
关键字不可以被省略。
//constructor 可以被省略
class People (name: String) { ... }
//constructor 不可以被省略
class public @Inject People (name: String) { ... }
2.2 初始化块
由于主构造器不可以含有任何代码,初始化代码可以放在 init 初始化块
中。
class People(var name: String) {
init {
name = "Mike"
}
init {
name = name.toUpperCase()
}
}
如果类体中存在多个 init 代码块
,那么其执行顺序和其在类体中的顺序一致。
2.3 次构造函数
类体中可以声明以 constructor
为前缀的次构造函数。
class People{
constructor{
....
}
}
如果类存在主构造函数,那么每个次构造函数需要直接 委托给主构造函数
,或者通过其他次构造函数间接 委托给主构造函数
。
class People(var name: String){
init{
name = "Mike"
}
constructor(name: String, age: Int):this(name){
....
}
}
2.4主构造函数、初始化块、次构造函数的执行顺序
代码示例:
class People(var name: String) {
init {
println(name)
}
init {
name = name.toUpperCase()
println(name)
}
constructor(name: String, age: Int, sex: String) : this(name, age) {
println("the age of $name is $age is $sex")
}
constructor(name: String, age: Int) : this(name) {
println("the age of $name is $age")
}
}
Main 中的调用:
val people = People("mike",34,"man")
可以看到我们仅仅是初始化了一个变量 – people
, 没有做其他操作。其打印日志如下:
mike
MIKE
the age of mike is 34
the age of mike is 34 is man
从上面的打印日志我们可以发现
- 初始化块优先于次构造函数执行
- 初始化块间的执行顺序和其在类体中的顺序一致
- 次构造函数之间的执行顺序和其依赖关系一致。
其原因如下:
初始化块中的代码实际上会成为主构造函数的一部分,它委托给主构造函数
会作为次构造函数的第一条语句,因此所有初始化块中的代码都会在次构造函数体
之前执行。即使该类没有主构造函数,这种委托仍会隐式发生,并且仍会执行初始
化块。
class People{
init{
....
}
}
2.5 默认主构造函数
一个非抽象而且没有声明任何构造函数的类,它会默认生成一个不带参数的主构造函数,其可见性默认为 public
。如果你不希望你的类有一个公有的构造函数,你可以显式的声明该主构造函数为 private
。
class People private constructor(){
....
}