Kotlin 类、属性、方法、继承、多态
一、Kotlin 类
1. kotlin 定义类
- 使用 open 修饰类,表明可被子类继承
- 使用 open 修饰属性,表明可被子类覆写
open class Phone constructor(open val system: String = "") {
var name: String = ""
var price: Int = 0
constructor(system: String, name: String, price: Int) : this(system) {
this.name = name
this.price = price
}
fun printField() {
println("system: $system, name: $name, price: $price")
}
override fun toString(): String {
return "Phone{system: $system, name: $name, price: $price}"
}
init {
println("phone init: $system")
}
}
2. kotlin 类继承
类使用冒号 : 继承
class Android : Phone() {
override val system: String = "android"
init {
println("android init")
}
}
class iOS : Phone() {
override val system: String = "iOS"
}
3. kotlin 延迟初始化属性
- kotlin 使用 lateinit 修饰:当已知属性不会为空时,但在程序上下文中属于延后初始化值
- 不需要赋初始值。如果在初始化之前,访问该属性,会报属性还未初始化的异常
class Teacher {
lateinit var name: String
}
4. kotlin 属性的 setter 和 getter 方法
kotlin 会为非 private 修饰的属性自动生成对应的 setter 和 getter 方法,调用时用 实例加点 调用即可。
class Kid {
var name: String = ""
var age: Int = 0
get() {
return 18
}
set(value) {
if (value > 18) {
println("超出了儿童年龄")
} else {
field = value
}
}
private var sex = "male"
override fun toString(): String {
return "Kid{name: $name, age: $age}"
}
}
fun main() {
val kid = Kid()
kid.name = "Tom"
kid.age = 14
println(kid)
}
二、Kotlin componentN 方法和解构
1. kotlin 定义 componentN 方法
class ComponentClass(
var system: String = "",
var name: String = "",
var price: Int = 0
) {
operator fun component1(): String {
return system
}
operator fun component2(): String {
return name
}
operator fun component3(): Int {
return price
}
}
2. kotlin 解构赋值
fun main() {
val comIns1 = ComponentClass("harmony", "huawei", 3999)
val (system1, name1) = comIns1
println("system: $system1, name: $name1")
val comIns2 = ComponentClass("ios", "iphone 12", 4999)
val (system2, name2, price2) = comIns2
println("system: $system2, name: $name2, price: $price2")
val comIns3 = ComponentClass("ios", "iphone 8", 1999)
val (_, _, price) = comIns3
println("price: $price")
}
3. kotlin 数据类
kotlin 使用 data class 定义数据类,有如下特点:
- 数据类会自动生成含有属性各种组合的构造器
- 数据类会为每个属性生成 componentN() 方法
- 数据类要求主构造器至少含有一个参数
- 数据类会自动生成 toString() 方法,可用于打印
data class PhoneData(
var system: String = "",
var name: String = "",
var price: Int = 0
)
fun main() {
val data1 = PhoneData()
val data2 = PhoneData("android")
val data3 = PhoneData("android", "meizu")
val data4 = PhoneData("data_android", "data_xiaomi", 4999)
val (data_system, data_name, data_price) = data4
println("system: $data_system, name: $data_name, price: $data_price")
}
三、Kotlin 类型检查与转换
1. kotlin 类型检查 is
open class Base
class Sub : Base()
fun main() {
val base = Base()
val sub1: Sub = Sub()
val sub2: Base = Sub()
println(sub1 is Sub)
println(sub1 is Base)
println(base is Sub)
}
2. kotlin 类型转换 as as?
- 子类实例 转为 父类型,转换成功
- 类型为父类型,引用实例的是子类的实例,将其转为父类型,可以转换成功
- 父类实例 转为 子类型,报转换异常,需要使用 as? 进行安全转换,转换结果为 null
fun main() {
val base = Base()
val sub1: Sub = Sub()
val sub2: Base = Sub()
val cla1 = sub1 as Base
val cla2 = sub2 as Base
val cla3 = base as? Sub
}
|