Kotlin - 继承

继承作为OOP的三大特性之一,Kotlin对其必然有自己的理解。Kotlin以“:”操作符,完成子类继承父类。

Any

The root of the Kotlin class hierarchy. Every Kotlin class has [Any] as a superclass.

在官方文档上是这么介绍Any类的,Any类是所有Kotlin文件的根,所有的类均继承于Any类。

创建一个类时,若未声明父类,其会隐式的继承于Any.

class Example // 隐式继承与 Any

Any类并不是java.lang.Object类。从下面的Any源码可以看出,其仅有equals(other: Any?)、 hashCode()、toString()等三个方法,并没有任何其他成员属性。

public open class Any {

    public open operator fun equals(other: Any?): Boolean
    public open fun hashCode(): Int
    public open fun toString(): String
}

声明父类

声明一个明确的父类, 需要在类头后加冒号再加父类即可。

open class Base(p: Ont)
class Derived(p: Int) : Base(p)

子类有主构造函数

如果子类有主构造函数, 则基类必须在主构造函数中立即初始化。

open class Person(var name : String, var age : Int){

    override fun toString(): String{
        return "Person(name='$name', age=$age)"
    }

}

class Student(name : String, age : Int, var no : String, var score : Int) : Person(name, age) {

}

子类没有主构造函数

如果子类没有主构造函数,则必须在每一个二级构造函数中用 super 关键字初始化基类,或者在代理另一个构造函数。初始化基类时,可以调用基类的不同构造方法。

calss MyView : View {

    constructor(ctx: Context) : super(ctx) {
    } 

    constructor(ctx: Context, attrs: AttributeSet) : super(ctx,attrs) {
    }
}

重写

在父类中,使用fun声明函数时,此函数默认为final修饰,不能被子类重写。如果允许子类重写该函数,那么就要手动添加open修饰它。

open class Person(var name : String, var age : Int) : Any() {

    open fun doSwim() {

    }

    override fun toString(): String{
        return "Person(name='$name', age=$age)"
    }

}

子类继承父类的函数

在kotlin中, 实现继承通常遵循如下规则:如果一个类从它的直接父类继承了同一个函数的多个实现,那么它必须重写这个函数并且提供自己的实现(或许只是直接用了继承来的实现) 为表示使用父类中提供的方法我们用 super 表示。

open class A {
    open fun f () { print("A") }
    fun a() { print("a") }
} 

interface B {
    fun f() { print("B") } //接口的成员变量默认是 open 的
    fun b() { print("b") }
} 

class C() : A() , B{
    override fun f() {
        super<A>.f()//调用 A.f()
        super<B>.f()//调用 B.f()
    }
}

C继承自a()或 b(),C不仅可以从A或则B中继承函数,而且C可以继承A()、B()中共有的函数。此时该函数在中只有一个实现,为了消除歧义,该函数必须调用A()和B()中该函数的实现,并提供自己的实现。

子类继承父类的成员变量

当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。具体的原则如下:

  1. 能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;
  2. 对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
  3. 对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值