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: 构造函数赋值
*/
}
相关推荐
一丝晨光21 小时前
逻辑运算符
java·c++·python·kotlin·c#·c·逻辑运算符
消失的旧时光-19431 天前
kotlin的密封类
android·开发语言·kotlin
AntDreamer1 天前
在实际开发中,如何根据项目需求调整 RecyclerView 的缓存策略?
android·java·缓存·面试·性能优化·kotlin
极客先躯2 天前
java和kotlin 可以同时运行吗
android·java·开发语言·kotlin·同时运行
滴水成冰-3 天前
Kotlin-Flow学习笔记
笔记·学习·kotlin
_Shirley4 天前
android.view.InflateException: Binary XML file line #7: Error inflating class
android·xml·java·ide·kotlin·android studio
ChinaDragonDreamer4 天前
Kotlin:1.9.0 的新特性
android·开发语言·kotlin
帅次6 天前
Android Studio:驱动高效开发的全方位智能平台
android·ide·flutter·kotlin·gradle·android studio·android jetpack
深海呐6 天前
Android 用线程池实现一个简单的任务队列(Kotlin)
android·kotlin·线程池·延时任务队列·线程池延时任务
我命由我123457 天前
Kotlin 极简小抄 P2(插值表达式、运算符、选择结构赋值)
android·java·开发语言·后端·kotlin·安卓