大家好,我是青空。今天给大家带来的是kotlin 继承。
文末可领取大厂面试题
所有类都继承 Any 类
Any 不是 java.lang.Object
是所有类的超类
没有超类型声明的类是默认超类
Any 默认提供了三个函数
-
equals()
-
hashCode()
-
toString()
把超类型 放在冒号 之后
open class Base(p: Int)
class Derived(p: Int) : Base(p)
构造函数
子类有主构造函数
-
必须在主构造函数中立即初始化
-
即冒号后的结构体必须传值进去
子类没有主构造函数
-
必须在每一个二级构造函数中用 super 关键字初始化基类
-
或者在代理另一个构造函数
class Student : Person {
constructor(ctx: Context) : super(ctx) {
}
constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) {
}
}
Java没有主构造的概念
但Android中View的子类,必须要有一个构造函数
有一点差不多的意思
重写方法
Kotlin 力求清晰显式
- 加强了继承的限制。也就加强了 类之间的关联界定
使用fun声明函数时,此函数默认为final修饰,不能被子类重写
如果允许子类重写该函数,那么就要手动添加 open 修饰它
子类重写方法使用 override 关键词
跟java的差异
-
能否被继承需要open关键字标明
-
默认无法被继承
重写属性
override
这基本跟java一致
kotlin中,override某变量,需要标注override
这也是加强了类继承中,变量重写的界定
总体来说
kotlin较java
kotlin对继承更细化
对继承中,增强 改变的部分 的标注
派生类 初始化顺序
1、父结构体 2、父结构体内参数处理 3、子类 init & 属性
范例
open class Base(val name: String) {
open val size: Int =
name.length.also { println("Initializing size in Base: $it") }
init { println("Initializing Base"+size) }
}
class Derived(
name: String,
val lastName: String
) : Base(name.capitalize().also { println("Argument for Base: $it") }) {
init { println("Initializing Derived") }
override val size: Int =
(super.size + lastName.length).also { println("Initializing size in Derived: $it") }
}
fun main() {
println("Constructing Derived(\"hello\", \"world\")")
val d = Derived("hello", "world")
}
输出
Constructing Derived("hello", "world")
Argument for Base: Hello
Initializing size in Base: 5
Initializing Base0
Initializing Derived
Initializing size in Derived: 10
注意
-
初始化是有顺序的
-
留意:打印的属性值
-
看Base中的size值,在init中是无法正确获取的
-
基类的open属性,不能被构造函数、属性初始化器、init块中使用open成员
调用超类实现
使用 super 关键字
基本与java一致
留意
在一个内部类中访问外部类的超类,可以通过由外部类名限定的 super 关键字来实现:super@Outer
范例
class FilledRectangle: Rectangle() {
fun draw() { /* …… */ }
val borderColor: String get() = "black"
inner class Filler {
fun fill() { /* …… */ }
fun drawAndFill() {
super@FilledRectangle.draw() // 调用 Rectangle 的 draw() 实现
fill()
println("Drawn a filled rectangle with color ${super@FilledRectangle.borderColor}") // 使用 Rectangle 所实现的 borderColor 的 get()
}
}
}
super覆盖规则
一个类继承多个
为了表示采用从哪个超类型继承的实现
- 由尖括号中超类型名限定的 super,如 super
范例
open class Rectangle {
open fun draw() { /* …… */ }
}
interface Polygon {
fun draw() { /* …… */ } // 接口成员默认就是“open”的
}
class Square() : Rectangle(), Polygon {
// 编译器要求覆盖 draw():
override fun draw() {
super<Rectangle>.draw() // 调用 Rectangle.draw()
super<Polygon>.draw() // 调用 Polygon.draw()
}
}
最近又赶上跳槽的高峰期,好多粉丝,都问我有没有最新大厂面试题,我连日加班好多天,终于整理好了,1000+ 道,20多份大厂面试题大全,我会持续更新中!公众号回复【面试题】即可获取。