每天学一点 Kotlin -- 类的进阶:抽象类
2021-11-15 本文已影响0人
冯可乐同学
----《第一季Kotlin崛起:次世代Android开发 》学习笔记
总目录:每天学一点 Kotlin ---- 目录
上一篇:每天学一点 Kotlin -- 类的进阶:继承
下一篇:每天学一点 Kotlin -- 类的进阶:接口
1. 抽象类
1.1 抽象类是要告诉继承它的类:有一些属性和方法没有具体赋值和实现,需要在子类中完成。
1.2 在 Kotlin 中,定义抽象类也用 abstract 关键字类修饰。即:在类名前加上修饰符 abstract,并且在需要抽象的属性或方法前也要加上修饰符 abstract。举个栗子:
abstract class AbstractClass1 {
var name = "name";
abstract var content: String
abstract fun getLenOfContent(): Int
}
对属性或方法申明了抽象之后,只在属性或方法前加上关键字 abstract 就可以了,这时就不用加关键字 open 了。
1.3 子类继承抽象类后,只需完整赋值或实现抽象的属性或方法即可。举个栗子:
fun main() {
testAbstract2()
}
fun testAbstract2() {
var a2 = AbstractClass2()
a2.content = "testAbstract2"
println("a2.content = ${a2.content}")
println("a2.getLenOfContent() = ${a2.getLenOfContent()}")
}
class AbstractClass2 : AbstractClass1() {
override var content: String = ""
set(value) {
field = value
}
override fun getLenOfContent(): Int = content.length
}
打印结果:
a2.content = testAbstract2
a2.getLenOfContent() = 13
2. 重写和重载
2.1 重载和重写: 和Java中的概念相同。
(1) 重写:子类重写父类中的方法,子类和父类的方法名和参数个数及参数顺序完全相同;
(2) 重载:在同一个类中,有多个同名的方法,但是方法之间的参数个数或参数顺序不同。注意:方法的参数完全相同但是返回值不同时,不是重载。
2.2 举个栗子:
fun main() {
testOverrideTest2()
}
fun testOverrideTest2() {
var o1 = OverrideTest1()
o1.printMsg("msg1")
o1.printMsg("msg1", "tag1")
var o2 = OverrideTest2()
o2.printMsg("msg2")
}
open class OverrideTest1 {
open fun printMsg(msg: String) = println(msg)
fun printMsg(msg: String, tag: String) = println(msg)
}
class OverrideTest2 : OverrideTest1() {
override fun printMsg(msg: String) = println("print msg in Child: ${msg}")
}
打印结果:
msg1
msg1
print msg in Child: msg2