Kotlin学习(7)-类和对象之类的继承、接口

1.普通类

Kotlin如同Java一样也拥有一个超类——Any(Java是Object),Any提供了3个方法:equals()、hashCode()和toString()。Kotlin中的类默认都是不可以继承的,如果想要继承一个类则需要添加关键字"open"。

open class Fruit(var area: String = "上海") {
    //...
}


//父类Fruit已经在构造函数中声明了属性,子类就不需重复声明(不需要添加val/var)
class Apple(area: String = "陕西") : Fruit(area) {
    
}

kotlin中的权限修饰符与Java大体一样,除了private,protected,public外,又增加了一个internal修饰符。internal代表范围是只对本模块内部开放。

2.抽象类继承

抽象类的关键字是“abstract”,抽象类不能实例化,构造函数也不需要提供默认参数值。

abstract class Animal {
        
    abstract fun getLikeFood():String
}

//子类继承Animal(),
class Rabbit(var food: String) : Animal() {

    override fun getLikeFood(): String {
        return food
    }
}

class Monkey(var food: String) : Animal() {
    override fun getLikeFood(): String {
        return food
    }
}

//实例化子类,输出具体动物喜爱的食物
var rabbit = Rabbit("胡萝卜")
var monkey = Monkey("香蕉")

println("------->rabbit 喜欢吃${rabbit.getLikeFood()}")
println("------->monkey 喜欢吃${monkey.getLikeFood()}")

I/System.out: ------->rabbit 喜欢吃胡萝卜
I/System.out: ------->monkey 喜欢吃香蕉

3.接口

与Java一样,Kotlin不支持多重继承。也是使用接口(interface)来实现多重继承。看下面的示例代码:

interface IBehavior {
   
    open abstract fun burrow(): String

    fun climbTree(): String

    fun run(): String {
        return "这种动物跑的最快"
    }

    //接口属性,抽象类型
    open abstract var hunt:String
    //接口属性,访问器类型
    val propertyWithImplementation: String
        get() = "foo"

}

//实现接口IBehavior
class Cheetah(var food: String, override var hunt: String) : Animal(), IBehavior {
    override fun getLikeFood(): String {
        return food
    }

    override fun burrow(): String {
        return "猎豹不打洞"
    }

    override fun climbTree(): String {
        return "猎豹会爬树"
    }

   
    override fun run(): String {
        return super.run()
    }
}
  • Kotlin接口的实现同样是“:”后跟接口名;
  • Kotlin接口不能定义构造函数;
  • Kotlin接口内方法默认是抽象的(abstract关键字可以省略);
  • Kotlin接口允许在接口内部实现方法(非abstract方法,Java8及其以上开始支持).
  • Kotlin接口允许声明属性(属性是抽象的或提供访问器实现)

实现猎豹对象:

var cheetah = Cheetah("羚羊", "Suffocate the antelope")
println("------> ${cheetah.burrow()},${cheetah.climbTree()}")
println("------> 猎豹喜欢吃${cheetah.getLikeFood()},捕猎方式是${cheetah.hunt}")
println("------> ${cheetah.run()}")

//--------打印结果
I/System.out: ------> 猎豹不打洞,猎豹会爬树
I/System.out: ------> 猎豹喜欢吃羚羊,捕猎方式是Suffocate the antelope
I/System.out: ------> 这种动物跑的最快

4.接口代理

Kotlin引入接口代理。一个类先声明继承自某个接口,但并不直接实现该接口的方法,而是把已经实现该接口的代理类作为参数传给前面的类。使用关键字by。

class BehaviorClimb:IBehavior {
    override fun burrow(): String {
        return "不打洞"
    }

    override fun climbTree(): String {
        return "但爬树"
    }

    override var hunt: String = "用前爪"


}

class Monkey(var food: String, behavior: IBehavior) : Animal(), IBehavior by behavior {
    override fun getLikeFood(): String {
        return food
    }
}

//接口代理
var monkey = Monkey("香蕉", behavior = BehaviorClimb())
println("------->monkey 喜欢吃${monkey.getLikeFood()},${monkey.burrow()},${monkey.climbTree()}")

你可能感兴趣的:(Android学习中的笔记,Kotlin,kotlin)