前言

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) {    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.f()//调用 A.f()        super.f()//调用 B.f()    }}fun main(args: Array) {    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.f()//调用 A.f()        super.f()//调用 B.f()    }}fun main(args: Array) {    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.foo()        super.foo()    }    override fun bar() {        super.bar()    }}fun main(args: Array) {    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

更多相关文章

  1. Android实现计时与倒计时(限时抢购)的几种方法
  2. Android之布局属性重点
  3. Android自定义View的实现方法,带你一步步深入了解View(三) 。
  4. 【移动开发】Android中图片过大造成内存溢出,OOM(OutOfMemory)异常
  5. Android 超简单的录制屏幕视频及生成GIF文件的方法
  6. android中的布局 (一)TextView 的属性介绍
  7. Android处理图片OOM的若干方法小结

随机推荐

  1. mysql 5.7.15版本安装配置方法图文教程
  2. Linux下MySQL卸载和安装图文教程
  3. MySQL5.6.22安装配置方法图文教程
  4. Mysql优化之Zabbix分区优化
  5. 数据库管理中19个MySQL优化方法
  6. MySQL使用的常见问题解决与应用技巧汇总
  7. MySQL中索引与视图的用法与区别详解
  8. MySQL中参数sql_safe_updates在生产环境
  9. mysql5.7.17在win2008R2的64位系统安装与
  10. centos上安装mysql并设置远程访问的操作