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

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

版权声明:著作权归作者所有。

相关推荐

有用的Kotlin版Rx代码片段1

只是几个随机的,可能有用的Rx片段(kotlin版)。计时器是的,只是一个简单的计时器,运行5秒。Observable.interval(1, TimeUnit.SECONDS, Schedulers.newThread())         .take(5)    &

基于RxJava和Kotlin封装类处理网络加载数据

在Android开发里,常常需要处理网络加载数据,这里基于RxJava,和Kotlin的Sealed class(封装类)的特性实现的一个示例。Resource.kt首先使用Kotlin的sealed class实现Resource.kt,它用来包装数据和状态。sealed class Resource<out T> { &n

Kotlin:数组的基本操作

Kotlin使用Array类来表示数组,构造函数为:<init> Array(size: Int, init: (Int) -> T) size:数组大小init:初始化数组创建数组Kotlin提供了几种方法方便我们创建数组,包括:构造函数,标准库提供的arrayOf, arrayOfNulls 和emptyArray等 。构造函数// 创建 一个值

TypeScript:接口(interface)属性的定义

  在TypeScript里,接口扮演了一个定义数据结构的角色,它在TypeScript的类型检查中起到很重要的作用。基本用法匿名定义sayHello(person: {name:string}) { console.log(person.name + ", 您好!"); } 这是一个很简单的例子,它使用匿