Kotlin 类

1、声明

class 关键字声明类

类声明由类名、类头(指定其类型参数、主构造函数等)以及由花括号包围的类体构成;类头与类体都是可选的; 如果一个类没有类体,可以省略花括号

Kotlin 复制代码
class Person { /*......*/ }

// 没有声明任何(主或次)构造函数,它会有一个生成的不带参数的主构造函数
// 构造函数的可见性是 public
class Empty
2、主构造函数

一个类有一个主构造函数并可能有一个或多个次构造函数;主构造函数在类头中声明,它跟在类名与可选的类型参数后

Kotlin 复制代码
class Person constructor(firstName: String) { /*......*/ }

主构造函数没有任何注解或者可见性修饰符,可以省略这个 constructor 关键字

Kotlin 复制代码
// 单参数,firstName 属于主构造函数局部变量
class Person(firstName: String) { /*......*/ }
// 多个参数,firstName firstName 属于类只读属性,age 属于类可读写属性
class Person(val firstName: String, val firstName: String, var age: Int)
// 具有默认参数,firstName firstName 属于类只读属性,var 属于带默认值的类可读写属性
class Person(val firstName: String, val lastName: String, var isEmployed: Boolean = true)

如果构造函数有注解或可见性修饰符,这个 constructor 关键字是必需的,并且这些修饰符在它前面

Kotlin 复制代码
class Customer public @Inject constructor(name: String) { /*......*/ }
3、次构造函数

类体内使用 constructor 前缀 声明 次构造函数

Kotlin 复制代码
class Person(val pets: MutableList<Pet> = mutableListOf())

class Pet { 
    // 声明次构造函数
    constructor(owner: Person) {
        owner.pets.add(this)
    }
}

若类有一个主构造函数,每个次构造函数需要委托给主构造函数, 可以直接委托或者通过别的次构造函数间接委托;委托到同一个类的另一个构造函数用 this 关键字即可

Kotlin 复制代码
class Person(val name: String) {
    val children: MutableList<Person> = mutableListOf()
    constructor(name: String, parent: Person) : this(name) {
        parent.children.add(this)
    }
}
4、初始化块

类体内用 init 关键字 加花括号 { } ,可为变量赋值 , 执行一些检查相关的代码

Kotlin 复制代码
class Constructors {
    init {
        println("Init block")
    }

    constructor(i: Int) {
        println("Constructor $i")
    }
}
5、类成员

类可以包含:

  • 构造函数与初始化块
  • 函数
  • 属性
  • 嵌套类与内部类
  • 对象声明
6、类实例化

创建一个类的实例,只需像普通函数一样调用构造函数

Kotlin 复制代码
val invoice = Invoice()
val customer = Customer("Joe Smith")

实例化执行顺序

  • 主构造函数 中属性赋值
  • 类中的属性赋值 和 init 初始化块 是 同一个层级,按出现的顺序执行
  • 次构造函数 中的代码执行
Kotlin 复制代码
class InitOrderDemo(
    // 主构造函数
    value: Int,   // 临时变量, 为secondProperty属性赋值
    var mainProperty: String // 在主构造函数中定义类属性mainProperty
) {
    // 类属性
    var firstProperty = "第一个属性: $value".also(::println)
    var secondProperty: Int = value
    // 初始化块1
    init {
        println("执行第一个初始化块, mainProperty: $mainProperty")
        println("执行第一个初始化块, firstProperty: $firstProperty")
        println("执行第一个初始化块, secondProperty: $secondProperty")
        // 位于 thirdProperty 属性前,所以无法访问 thirdProperty
        //println("执行第一个初始化块, thirdProperty: $thirdProperty")
    }
    // 次构造函数
    constructor(_value: Int): this(_value, "次构造函数") {
        thirdProperty = "构造函数赋值"
        println("执行次构造函数, mainProperty: $mainProperty")
        println("执行次构造函数, firstProperty: $firstProperty")
        println("执行次构造函数, secondProperty: $secondProperty")
        println("执行次构造函数, thirdProperty: $thirdProperty")
    }
	// 类属性
    var thirdProperty = "第三个属性"
	// 初始化块2
    init {
        println("执行第一个初始化块, mainProperty: $mainProperty")
        println("执行第二个初始化块, firstProperty: $firstProperty")
        println("执行第二个初始化块, secondProperty: $secondProperty")
        // thirdProperty 属性已经存在,可以访问
        println("执行第二个初始化块, thirdProperty: $thirdProperty")
    }
}
Kotlin 复制代码
fun main() {
    InitOrderDemo(123, "测试顺序")
/*
    第一个属性: 123
    执行第一个初始化块, mainProperty: 测试顺序
    执行第一个初始化块, firstProperty: 第一个属性: 123
    执行第一个初始化块, secondProperty: 123
    执行第一个初始化块, mainProperty: 测试顺序
    执行第二个初始化块, firstProperty: 第一个属性: 123
    执行第二个初始化块, secondProperty: 123
    执行第二个初始化块, thirdProperty: 第三个属性
*/

    InitOrderDemo(456)
/*
    第一个属性: 456
    执行第一个初始化块, mainProperty: 次构造函数
    执行第一个初始化块, firstProperty: 第一个属性: 456
    执行第一个初始化块, secondProperty: 456
    执行第一个初始化块, mainProperty: 次构造函数
    执行第二个初始化块, firstProperty: 第一个属性: 456
    执行第二个初始化块, secondProperty: 456
    执行第二个初始化块, thirdProperty: 第三个属性
    执行次构造函数, mainProperty: 次构造函数
    执行次构造函数, firstProperty: 第一个属性: 456
    执行次构造函数, secondProperty: 456
    执行次构造函数, thirdProperty: 构造函数赋值
*/
}
相关推荐
KotlinKUG贵州8 小时前
Kotlin/Ktor 实践:利用 MCP 从零打造 AI Agent 服务端指南
kotlin·agent·mcp
喜熊的Btm9 小时前
探索 Kotlin 的不可变集合库
kotlin·android jetpack
モンキー・D・小菜鸡儿2 天前
Android 中 StateFlow 的使用
android·kotlin
我又来搬代码了2 天前
【Android】【Compose】Compose知识点复习(一)
android·前端·kotlin·android studio
hnlgzb2 天前
好像kotlin class和kotlin file都可以是activity?
android·开发语言·kotlin
zhangphil2 天前
Kotlin超时withTimeout超时与ensureActive()取消协程任务执行
kotlin
hnlgzb2 天前
安卓app开发,如何快速上手kotlin和compose的开发?
android·开发语言·kotlin
alexhilton2 天前
Jetpack Compose 2025年12月版本新增功能
android·kotlin·android jetpack
lin62534223 天前
Android九宫格,1张图到9张图适配;图片自定义UI
android·ui·kotlin