kotlin继承

navysummer navysummer     2022-12-02     346

关键词:

Kotlin 中所有类都继承该 Any 类,它是所有类的超类,对于没有超类型声明的类是默认超类:

class Example // 从 Any 隐式继承

Any 默认提供了三个函数:

equals()

hashCode()

toString()

注意:Any 不是 java.lang.Object。

如果一个类要被继承,可以使用 open 关键字进行修饰。

open class Base(p: Int)           // 定义基类

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

构造函数

子类有主构造函数

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

open class Person(var name : String, var age : Int)// 基类



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



// 测试
fun main(args: Array<String>) 
    val s =  Student("Runoob", 18, "S12346", 89)
    println("学生名: $s.name")
    println("年龄: $s.age")
    println("学生号: $s.no")
    println("成绩: $s.score")

输出结果:

学生名: Runoob
年龄: 18
学生号: S12346
成绩: 89

子类没有主构造函数

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

class Student : Person 

    constructor(ctx: Context) : super(ctx) 
     

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

实例

/**用户基类**/
open class Person(name:String)
    /**次级构造函数**/
    constructor(name:String,age:Int):this(name)
        //初始化
        println("-------基类次级构造函数---------")
    


/**子类继承 Person 类**/
class Student:Person

    /**次级构造函数**/
    constructor(name:String,age:Int,no:String,score:Int):super(name,age)
        println("-------继承类次级构造函数---------")
        println("学生名: $name")
        println("年龄: $age")
        println("学生号: $no")
        println("成绩: $score")
    


fun main(args: Array<String>) 
    var s =  Student("Runoob", 18, "S12345", 89)

输出结果:

-------基类次级构造函数---------
-------继承类次级构造函数---------
学生名: Runoob
年龄: 18
学生号: S12345
成绩: 89

重写

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

/**用户基类**/
open class Person
    open fun study()       // 允许子类重写
        println("我毕业了")
    


/**子类继承 Person 类**/
class Student : Person() 

    override fun study()    // 重写方法
        println("我在读大学")
    


fun main(args: Array<String>) 
    val s =  Student()
    s.study();

输出结果为:

我在读大学

如果有多个相同的方法(继承或者实现自其他类,如A、B类),则必须要重写该方法,使用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()
    


fun main(args: Array<String>) 
    val c =  C()
    c.f();

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

输出结果为:

AB

属性重写

属性重写使用 override 关键字,属性必须具有兼容类型,每一个声明的属性都可以通过初始化程序或者getter方法被重写:

open class Foo 
    open val x: Int get  …… 


class Bar1 : Foo() 
    override val x: Int = ……

你可以用一个var属性重写一个val属性,但是反过来不行。因为val属性本身定义了getter方法,重写为var属性会在衍生类中额外声明一个setter方法

你可以在主构造函数中使用 override 关键字作为属性声明的一部分:

interface Foo 
    val count: Int


class Bar1(override val count: Int) : Foo

class Bar2 : Foo 
    override var count: Int = 0

kotlin中级---kotlin类之的继承.md

Kotlin继承类1.超类(Any)在Kotlin中,所有的类都是继承自Any类,这是一个没有父类型的类。即当我们定义各类时,它默认是继承于Any类的例如:classPerson因为Any这个类只是给我们提供了equals、hashcode、toString三个方法&#x... 查看详情

如何在 Kotlin 中用继承的类覆盖方法?

】如何在Kotlin中用继承的类覆盖方法?【英文标题】:HowtooverridemethodwithinheritedclassinKotlin?【发布时间】:2022-01-1209:16:14【问题描述】:我正在探索并积极在Kotlin的生产环境中使用泛型。Kotlin+泛型对我来说是一个很大的难题,所... 查看详情

从 Kotlin Native 继承 UIView

】从KotlinNative继承UIView【英文标题】:SubclassingUIViewfromKotlinNative【发布时间】:2021-11-1420:34:13【问题描述】:UIKit旨在通过子类和重写方法使用。通常,UIView的drawRectobjective-C方法在SWIFT中是这样实现的:importUIKitimportFoundationclassSm... 查看详情

在 Kotlin 中扩展 Java 类时继承的平台声明冲突

】在Kotlin中扩展Java类时继承的平台声明冲突【英文标题】:Inheritedplatformdeclarations***whenextendingaJavaclassinKotlin【发布时间】:2018-02-0900:52:05【问题描述】:我正在尝试使用Kotlin扩展第三方Java类,但我收到以下编译器消息:继承的... 查看详情

kotlin小悟-这个继承有点不一样(代码片段)

今天聊聊kotlin中关于构造函数的一个话题。我们知道,在kotlin中构造函数分为主构造函数和从构造函数,关于详细的内容,可以点击下面的文章链接了解。Kotlin系列之主构造方法和初始化语句块Kotlin系列之从构造方法... 查看详情

kotlin语言中的继承与构造函数(详解)(代码片段)

        学习kotlin时,有很多小伙伴无法理解为何有的继承结构父类后面需要加括号,有时候却不用加括号,本篇文章小编将为你们解除这个困惑!顺便为大家详解一下kotlin中的主构造函数和次构造函数。   ... 查看详情

从 Kotlin Psi API 检索继承类全名

】从KotlinPsiAPI检索继承类全名【英文标题】:RetrieveInheritanceclassfullnamefromKotlinPsiAPI【发布时间】:2021-11-0518:12:19【问题描述】:我正在尝试开发一个codegenIDEA-Plugin。这个插件应该分析KtClassInheritance并获取所有继承类全名(如com.ex... 查看详情

kotlin类与继承

类Kotlin使用class关键字声明类,类声明由类名、类头(指定其类型参数、主构造函数等)和由大括号包围的类体组成。类头和类体都是可选的,如果一个类没有类体大括号可省略class NoBody类的构造函数一类可以有一个主构造... 查看详情

kotlin初学者继承(extend)(代码片段)

Kotlin继承(extend)        Kotlin允许一个类继承自另一个类        Kotlin中所有类都继承自Any类        Any类是所有类的超类,对于没有超类型声明的类是默认超类        Kotlin类默认都是封闭的,要让某个类... 查看详情

kotlin类的继承(代码片段)

与Java不同,kotlin使用冒号,而Java中使用extends,注意冒号后面需要调用夫类的构造器。属于单继承,使用open关键字允许继承classpackageloaderman.demoopenclassPerson(name:String)protectedvarmName:String=namefungetName():StringreturnmNamepackageloaderman.democlass... 查看详情

在 Kotlin 中使用 Jpa 注释从基类继承父属性

】在Kotlin中使用Jpa注释从基类继承父属性【英文标题】:InheritparentpropertiesfromaBaseclasswithJpaannotationsinKotlin【发布时间】:2018-10-1808:55:53【问题描述】:我们所有的JPA实体都有一个@Id、@UpdateTimestamp、乐观锁定等...我的想法是创建... 查看详情

kotlin开发基础(代码片段)

...一时间获取我的最新文章,请关注公众号:技术特工队Kotlin开发基础(一)Kotlin开发基础(二)Kotlin开发基础(三)类本篇文章主要介绍类的继承,接口,复写,单例,以及object属性的介... 查看详情

kotlin类的继承①(使用open关键字开启类的继承|使用open关键字开启方法重写)(代码片段)

...open关键字开启方法重写一、使用open关键字开启类的继承Kotlin中的类默认都是封闭的,无法被继承,如果要想类被继承,需要在定义类时使用open关键字;定义一个普通的Kotlin类:classPerson(valname:String,valage:Int)funinfo()println("name:$name,age:$... 查看详情

kotlin类的继承①(使用open关键字开启类的继承|使用open关键字开启方法重写)(代码片段)

...open关键字开启方法重写一、使用open关键字开启类的继承Kotlin中的类默认都是封闭的,无法被继承,如果要想类被继承,需要在定义类时使用open关键字;定义一个普通的Kotlin类:classPerson(valname:String,valage:Int)funinfo()println("name:$name,age:$... 查看详情

kotlin类与继承(代码片段)

类kotlin中使用关键字class声明类类声明由类名,类头(指定其类型参数,主构造函数等),花括号包围的类体构成,类头和类体都是可选的。classStudent如果一个类没有类体,则可以省略花括号classEmpty主... 查看详情

kotlin开发基础(代码片段)

...一时间获取我的最新文章,请关注公众号:技术特工队Kotlin开发基础(一)Kotlin开发基础(二)Kotlin开发基础(三)类本篇文章主要介绍类的继承,接口,复写,单例,以及object属性的介... 查看详情

kotlin类属性方法继承多态(代码片段)

Kotlin类、属性、方法、继承、多态一、Kotlin类1.kotlin定义类使用open修饰类,表明可被子类继承使用open修饰属性,表明可被子类覆写/***Kotlin使用class定义类Phone,使用open修饰类,表明可被继承*主构造器参数为system... 查看详情

kotlin用super<>解决类继承接口函数名相同(代码片段)

kotlin用super<>解决类继承接口函数名相同interfaceIAfuntest()println("IA")interfaceIBfuntest()println("IB")classMyClass:IA,IBoverridefuntest()//重点//如果重载IA接口则super<IA>.test()super<IB>.test()funmain(args:Array<String>)MyClass().test(... 查看详情