关键词:
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三个方法... 查看详情
如何在 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(... 查看详情