android Kotlin 继承、派生、接口、构造方式,方法、属性重写
来源:互联网 发布:手机无损播放软件 编辑:程序博客网 时间:2024/06/07 12:54
前言
kotlin 作为google官方android 开发语言,大势所趋,据传到2018底kotlin要全面替代java在android中的地位,其实这个也不担心毕竟kotin和java可以100%互操作。两种语言进行编写也是可以的。
Kotlin 继承
1.使用 open 关键字进行修饰
2.主构造函数紧跟着在类后面声明的函数
open class Person(var name : String, var age : Int){// 基类}class Student(name : String, age : Int, var no : String, var score : Int) : Person(name, age) {}
// 二级构造函数
calss 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)}
方法重写
基类fun函数默认 final 修饰符,无法在子类进行重写
需要加上 open 修饰符号
方法获得,同名方法获得
一个类从其他类或者接口(继承实现来的方法),同名方法,在子类中必须显示进行调用
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();} 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();}
属性重写
属性重写使用 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) : Fooclass Bar2 : Foo { override var count: Int = 0}
Kotlin 接口
Kotlin 接口与 Java 8 类似,使用 interface 关键字定义接口,允许方法有默认实现:
interface MyInterface { fun bar() // 未实现 fun foo() { //已实现 // 可选的方法体 println("foo") }}
接口中的属性
接口中的属性只能是抽象的,不允许初始化值,接口不会保存属性值,实现接口时,必须重写属性:
interface MyInterface{ var name:String //name 属性, 抽象的}class MyImpl:MyInterface{ override var name: String = "runoob" //重载属性}
函数重写
实现多个接口时,可能会遇到同一方法继承多个实现的问题。例如:
实例
interface A { fun foo() { print("A") } // 已实现 fun bar() // 未实现,没有方法体,是抽象的}interface B { fun foo() { print("B") } // 已实现 fun bar() { print("bar") } // 已实现}class C : A { override fun bar() { print("bar") } // 重写}class D : A, B { override fun foo() { super<A>.foo() super<B>.foo() } override fun bar() { super<B>.bar() }}fun main(args: Array<String>) { val d = D() d.foo(); d.bar();}
输出结果为:
ABbar
实例中接口 A 和 B 都定义了方法 foo() 和 bar(), 两者都实现了 foo(),
B 实现了 bar()。因为 C 是一个实现了 A 的具体类,所以必须要重写 bar() 并实现这个抽象方法。
然而,如果我们从 A 和 B 派生 D,我们需要实现多个接口继承的所有方法,并指明 D 应该如何实现它们。
这一规则 既适用于继承单个实现(bar())的方法也适用于继承多个实现(foo())的方法。
引用
http://www.runoob.com/kotlin/kotlin-tutorial.html
- android Kotlin 继承、派生、接口、构造方式,方法、属性重写
- Kotlin学习记录(二)—— Kotlin的变量、属性、类、构造函数、继承、方法
- c++ 继承/派生、访问属性、构造函数
- 构造,封装,继承,多态,重载,重写,接口
- c#基础-继承,派生类,派生类的构造 方法
- 接口、类、抽象类、继承、构造函数、方法重写、方法重载、自动转型、多态、引用传递
- OC僵尸 属性 便利构造器 BOOL类型 继承 方法重写
- 重写和继承关系中的构造方法
- 总结:接口、类、抽象类、继承、构造函数、方法重写、方法重载、自动转型、多态、引用传递
- EXT 笔记 构造方法,类继承,类实例方法重写
- python-对象、私有属性_方法、继承(多重继承)、重写
- 继承--派生类类构造
- C#高级(五)继承,派生类,派生类的构造方法
- C#高级(五)继承,派生类,派生类的构造方法
- Android kotlin静态属性、静态方法
- oc基础之继承与重写构造方法(三)
- 不能说的秘密-重载、重写与继承中的构造方法
- 线程 创建和启动线程的两种方式 实现Runnable接口 继承Thread类 重写唯一方法run()
- Windows上使用JNA调用自己编写的DLL问题
- nginx分割日志
- 详解spring注解配置启动过程_java
- SpringBoot的拦截器中依赖注入为null
- ABP官方文档(二十七)【功能管理】
- android Kotlin 继承、派生、接口、构造方式,方法、属性重写
- 数据结构第九周项目(三)——利用二叉树遍历思想解决问题
- 在接口下应用简化流策略
- 工作2年的总结...
- 第九周-项目2
- 剑指offer之连续子数组的最大和(Python)
- ABP官方文档(三十一)【集成OData】
- CSS3 @media 查询
- 第九周 【项目1