发布于 4年前

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")

构建实例的方法是类名加上括号,其中括号里为构造函数的参数。没有参数,使用空括号。

©2020 edoou.com   京ICP备16001874号-3