1、抽象类
一个类需要一些方法来定义,但方法的具体实现形式暂时没办法确定,就可以定义抽象方法,该类就是抽象类,用关键词abstract。
抽象类里的函数没有具体表达式,就定义了个空函数在那。如果需要调用抽象方法,得创建个子类,在子类重写抽象方法,再进行调用。
抽象类定义语法格式如下:
abstract class Animal {
abstract fun eat()
}
举个栗子:
abstract class Animal {
abstract fun eat()
}
class Monkey(private val food: String) : Animal() {
override fun eat() {
println("猴子正在吃$food")
}
}
fun main() {
val monkey = Monkey("香蕉")
monkey.eat()
}
结果
2、接口
接口可以说是一个特殊的抽象类,定义接口需要interface关键字来声明,语法格式如下:
interface Animal {
fun eat()
}
举个栗子:
interface Animal {
fun eat()
}
class Monkey(private val food: String) : Animal {
override fun eat() {
println("猴子正在吃$food")
}
}
fun main() {
val monkey = Monkey("香蕉")
monkey.eat()
}
结果:
接口还可以继承另一个接口
interface Animal {
fun eat()
}
interface Monkey : Animal {
fun sleep()
}
class GoldenMonkey(private val food: String) : Monkey {
override fun eat() {
println("金丝猴正在吃$food")
}
override fun sleep() {
println("金丝猴正在睡觉")
}
}
fun main() {
val goldenMonkey = GoldenMonkey("香蕉")
goldenMonkey.eat()
goldenMonkey.sleep()
}
结果
普通类只能单继承,但接口可以多继承,代码如下所示,结果和上面一样。
interface Animal {
fun eat()
}
interface Monkey {
fun sleep()
}
class GoldenMonkey(private val food: String) : Animal, Monkey {
override fun eat() {
println("金丝猴正在吃$food")
}
override fun sleep() {
println("金丝猴正在睡觉")
}
}
fun main() {
val goldenMonkey = GoldenMonkey("香蕉")
goldenMonkey.eat()
goldenMonkey.sleep()
}