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: 构造函数赋值
*/
}
相关推荐
xvch5 小时前
Kotlin 2.1.0 入门教程(二十三)泛型、泛型约束、协变、逆变、不变
android·kotlin
xvch2 天前
Kotlin 2.1.0 入门教程(二十四)泛型、泛型约束、绝对非空类型、下划线运算符
android·kotlin
zhangphil2 天前
Android Coil ImageLoader MemoryCache设置Key与复用内存缓存,Kotlin
android·kotlin
mmsx2 天前
kotlin Java 使用ArrayList.add() ,set()前面所有值被 覆盖 的问题
android·开发语言·kotlin
lavins2 天前
android studio kotlin项目build时候提示错误 Unknown Kotlin JVM target: 21
jvm·kotlin·android studio
面向未来_3 天前
JAVA Kotlin Androd 使用String.format()格式化日期
java·开发语言·kotlin
alexhilton3 天前
选择Retrofit还是Ktor:给Android开发者的指南
android·kotlin·android jetpack
GordonH19913 天前
Kotlin 优雅的接口实现
android·java·kotlin
wangz763 天前
Android 下用kotlin写一个sqlite
android·sqlite·kotlin·jetpack compose
yzpyzp4 天前
kotlin中RxHttp的toAwaitResponse和awaitResult函数的使用
android·kotlin