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()}")