Kotlin语法基础之继承
来源:互联网 发布:淘宝秒杀网页 编辑:程序博客网 时间:2024/05/29 14:44
Kotlin中所有的类都有一个公有的超类:Any,这是所有没有声明超类的类的默认父类。
class Example //隐式继承自Any
Any!=Java.lang.Object。尤其,除了equals()、hashCode()和toString()三个方法外,没有任何成员。为了显式地声明超类,语法如下:
open class Base(p:Int) class Derived(p:Int):Base(p)
如果类具有主构造器,则可以使用主构造器的参数(并且必须)初始化父类。
如果类没有主构造器,那么每个辅助构造器初始化时需要使用super关键字,或者将其委托给其他构造器。需要注意的是,在这种情况下,不同的辅助构造器可以调用基类的不同构造器。
class MyView:View{ constructor(ctx:Context):super(ctx) constructor(ctx:Context,attrs:AttributeSet):super(ctx,attrs)}
open注解和Java的final相反:它允许其他类继承自该类。默认的,Kotlin中所有的类是final的,也就是说不能继承的。
覆写方法
Kotlin总是做一些明确的事情,不像Java,Kotlin要求复写方法时需要显式的注解和重写。
open class Base { open fun v() { println("Base.v()") } fun nv() { println("Base.nv") }}class Derived() : Base() { override fun v() { println("Derived.v()") }}
复写Derived的v()时,ovverride注解是必须的,否则编译器会报错。如果没有open注解,比如Base的nv(),那么在子类中是不能覆写该方法的。在一个final类中(没有open注解声明),open成员是禁止的。也就是说final类的每个成员也都是final的。
一个标记为override的成员自身就是open的,子类仍然可以覆写它。如果你想禁止覆写,那么使用final关键字。
open class AnotherDerived() : Base() { final override fun v() { println("AnotherDerived.v") }}
最后,main()验证多态性。
fun main(args: Array<String>) { var base1: Base = Base() var base2: Base = Derived() var base3: Base = AnotherDerived() base1.v() base2.v() base3.v()}
覆写属性
覆写属性和覆写方法基本类似;如果子类要重新声明父类中已经声明过的属性,那么需要使用override,并且类型要兼容。每个声明的属性可以被具有初始化器的属性或具有getter方法的属性覆盖。
open class Foo { open val x: Int get() { println("Foo") return 3 }}class Bar1 : Foo() { override val x: Int = 2}
可以使用var属性覆盖val属性,反之不可以。因为val属性基本上声明一个getter方法,并将其替换为var,另外在派生类中声明一个setter方法。
可以在主构造器使用override覆盖属性:
interface Aoo { val count: Int}class Aoo1(override val count: Int) : Aooclass Aoo2 : Aoo { override var count: Int = 0}
覆写准则
在Kotlin中,实现继承由以下规则控制:如果类从其直接超类继承同一成员的多个实现,则它必须覆盖该成员并提供自己的实现(可能使用其中一个继承)。 要表示从其继承的实现的超类型,可在尖括号中使用超类型名称超级限定,例如,super。
open class A { open fun f() { println("A") } fun a() { println("a") }}//接口的方法默认openinterface B { fun f() { println("B") } fun b() { println("b") }}class C() : A(), B { override fun f() { super<A>.f() super<B>.f() println("C") }}
上面的代码继承自A和B是没有问题的,a()和b()因为C知道继承自哪一个类。但是对于f(),我们有两个继承,所以我们需要覆写f(),并且需要提供我们的实现来消除歧义。
总结
- Kotlin中的类默认是final的,如果需要子类继承,需要使用open修饰;
- Kotlin中的方法默认是不允许复写的,只有用open修饰时,子类才可以进行覆写,并且需要使用override进行显示标注
- 属性也支持覆写
- Kotlin语法基础之继承
- Kotlin学习笔记之基础语法一
- kotlin 官方学习教程之基础语法
- Kotlin学习笔记之基础语法
- Kotlin入门篇之基础语法
- Kotlin语法基础之控制流
- Kotlin语法基础之运算符
- Kotlin基础语法之控制流
- Kotlin语法基础之运算符
- Java基础语法之继承
- Kotlin基础语法
- Kotlin 基础语法学习
- Kotlin基础语法
- Kotlin 基础语法
- Kotlin基础教程-基础语法
- 【Kotlin】基础语法学习
- kotlin基础语法
- kotlin基础语法学习
- JSR 133 Java 内存模型(JMM)FAQ
- M
- 活动报名 | 2017无人驾驶智能车Hackathon挑战赛
- c++结构体的使用
- Google Pixel 2 相机测试
- Kotlin语法基础之继承
- Leetcode 621. Task Scheduler
- 解题
- pyqt setStyleSheet用法
- 《CLR via C#(第4版)》【PDF】下载
- bzoj3411 [Usaco2009 Dec]Bobsledding 高山滑雪
- 数论——最大公约数和最小公倍数
- VS 内存问题
- 使用Canvas画一个弹跳的皮球