Skip to content

3. Kotlin 面向对象

3.1 类

Kotlin 类可以包含:构造函数和初始化代码块、函数、属性、内部类、对象声明。

kt
class Apple {
    // ...
}

也可以定义空类:

kt
class Empty

类的属性可以用关键字 var 声明为可变的,否则使用只读关键字 val 声明为不可变。

kt
class Runoob {
    var name: String = "alex"
    var url: String = "https://example.com/"
    var city: String = "Jiangsu"
}

创建类的实例不需要 new 关键字:

kt
val site = Apple()

Kotlin 中的类可以有一个 主构造器,以及一个或多个 次构造器,主构造器是类头部的一部分,位于类名称之后:

kt
class Person constructor(firstName: String) {}

如果主构造器没有任何注解,也没有任何可见度修饰符,那么 constructor 关键字可以省略:

kt
class Person(firstName: String) {
}

3.2 属性

属性支持 getter/setter:

kt
var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]

getter 和 setter 都是可选的:

kt
var allByDefault: Int? // 错误:需要一个初始化语句,默认实现了 getter 和 setter 方法
var initialized = 1    // 类型为 Int,默认实现了 getter 和 setter
val simple: Int?       // 类型为 Int,默认实现 getter,但必须在构造函数中初始化
val inferredType = 1   // 类型为 Int,默认实现 getter

3.3 继承

Kotlin 中所有类都继承该 Any 类,它是所有类的超类,对于没有超类型声明的类是默认超类:

kt
class Example // 从 Any 隐式继承

Any 默认提供了三个方法:

  • equals()
  • hashCode()
  • toString()

如果一个类要被继承,可以使用 open 关键字进行修饰:

kt
open class Base(p: Int)

class Derived(p: Int) : Base(p)

3.4 接口

Kotlin 接口与 Java 类似,使用 interface 关键字定义接口,允许方法有默认实现:

kt
interface MyInterface {
    fun bar()
    fun foo() {
        println("foo")
    }
}

接口中的属性只能是抽象的,不允许初始化值,接口不会保存属性值,实现接口时,必须重写属性:

kt
interface MyInterface {
    var name: String // 抽象属性 name
}

class MyImpl: MyInterface {
    override var name: String = "alex" // 重写属性
}

3.5 扩展

Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式。扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响。

扩展函数语法:

kt
fun receiverType.functionName(params) {
    body
}