Kotlin:类的定义
基本定义
Kotlin使用关键词class定义类,如:
class User {
}
声明类主要包括三部分:
- 类名:必选,类的名称,一般以大写字母开头。
- 类头:可选,类头包括type parameter(如泛型),主构造(primary constructor)等。
- 类体:可选,在Kotlin,类体是可选的,它有大括号{}括起来。
类头和类体是可选的,一个最简单的类可以声明为:
class Empty
声明类头
class Box<T>(t: T) {
}
其中<T>为type parameter,(t:T)为主构造。
构造函数
Kotlin里类的构造分为两种:
- 主构造(primary constructor):主构造在类头声明。
- 次构造(secondary constructor):次构造在类体声明。
主构造函数
主构造函数基本声明
class User constructor(name: String) {
}
它使用关键词constructor,声明在类名后面(如果没有type parameter)。
如果主构造函数没有注解(annotation)和可见修饰符,constructor可以去掉:
class User constructor(name: String) {
}
如果主构造函数有注解或者可见修饰符,constructor不能去掉:
class User public @Inject constructor(name: String) {
}
声明构造函数时可以给参数设定默认值。
class User constructor(name: String = "") {
}
设置默认值的方法是在参数声明后使用等号“=”赋值即可。
次构造函数
类的次构造函数在类体里声明,以关键词constructor开头
class User{
constructor(name: String, age: Int) {
}
}
如果类有声明主构造函数,那么次构造函数需要使用关键字this来委托给主构造函数。可以是直接委托,也可以通过其他的次构造函数间接委托主构造函数。
class User(name: String){
constructor(name: String, age: Int):this(name) {
}
}
初始块
主构造函数除了声明参数列表外,没有任何用于初始化的代码。在Kotlin,初始化单独放在初始块里,在类体内用关键字init声明。init后跟着一对大括号{}作为初始块。
init {
}
在初始块可以使用主构造函数传过来的参数:
class User(name: String){
init {
println("My name is $name")
}
}
在类体内可以有多个初始块
class User(name: String){
init {
println("first: $name")
}
init {
println("second: $name")
}
}
多个初始块按它们在类体的顺序依次执行。
初始块实际上可以认为是主构造函数的一部分。
属性
在类体内使用var或val声明属性
class User(name: String){
val name = "$name"
}
更简便的方法是在类的主构造函数里声明属性,上面的例子可以改为
class User(val name: String){
}
在主构造函数声明属性,只需要在参数前加上var或者val。
初始化顺序
初始块作为主构造的一部分,次构造函数在初始时会先调用this委托主构造函数,所有的初始块会在次构造函数之前执行。
属性和所有初始块有同等的执行优先级,属性和初始块会按照在类体的出现的顺序依次执行。
class User(name: String){
val firstProperty = "First property: $name".also(::println)
init {
println("First initializer block that prints ${name}")
}
val secondProperty = "Second property: ${name.length}".also(::println)
init {
println("Second initializer block that prints ${name.length}")
}
constructor(name: String, age: Int):this(name) {
println("secondary constructor.")
}
}
fun main(args: Array<String>) {
User("Jack",10);
}
输出依次为:
First property: Jack
First initializer block that prints Jack
Second property: 4
Second initializer block that prints 4
Secondary constructor.
构建实例
Java使用关键字new构造类的实例,而Kotlin不需要使用关键字new。
示例
User("Jack")
构建实例的方法是类名加上括号,其中括号里为构造函数的参数。没有参数,使用空括号。