kotlin精讲--第3章(8)接口&接口和抽象类异同
接口定义
一个类可以继承另一个普通类,也可以继承另一个抽象类,除此之外还可以实现另外一个接口。
什么是接口呢?生活中我们的显示器会有很多的接口,电脑会有很多的接口,手机也会有接口。一个接口,表示可以对外提供一种什么功能,如下图:

编程世界里,可以把一些独立的功能、模块、能力,定义为一个一个的接口。比如“可点击的”、“可触摸的”、“可滑动的”、“可吃的”。
接口实现
接口通过interface关键字实现,接口中的方法可以没有方法体。类通过冒号实现接口比如,我们定义一个可点击的接口(Clickable),一个按钮(Button)实现了可点击接口(Clickable),参考代码:

Java中的接口中的方法,不能有方法体(JDK1.8之后可以有),Kotlin中的接口方法,可以带有方法体(学习了jdk1.8的做法),不用open关键字修饰带有方法体的方法,接口的实现类也可以重写带有方法体的方法,参考代码:

Java接口中可以包含属性,属性必须被初始化。Kotlin中的接口中也可以包含属性,但是属性不能被初始化,需要交给子类初始化,子类如果不进行初始化,那么将变成抽象类。参考代码:

但其实,接口中定义属性定义带方法体的方法是比较少的情况。
一个类同时只能继承一个类,但是可以实现多个接口,这大大拓展了程序的拓展性,实现多个接口的时候,通过逗号去分割,参考代码:

在实现多个接口的时候,如果多个接口中定义了相同方法,接口实现类,则要对同名方法进行重新的实现,也可以调用不同接口中定义的同名方法,具体什么语法格式呢?参考代码:


可以看到,通过super.show()或者super.show()指定想要调用的方法。
接口和抽象类的异同
在Java中,抽象类和接口异同是一个经典问题,在Kotlin中接口和抽象类的异同也是一个经典问题。我们稍微总结下:
异
1、 接口是定义一些独立的功能、模块、能力,定义为一个一个的接口。比如“可点击的”、“可触摸的”、“可滑动的”、“可吃的”。接口是抽象功能,抽象类是抽象类别。
2、 接口可以看做是抽象类的延申,接口的抽象级别更高
3、 抽象类只能被单继承,接口可以多实现。
4、 抽象类被子类继承,接口被类实现。
5、 方法被abstract修饰,一定是抽象类。
同
1、 抽象类和接口都不能被实例化。
2、 抽象类和接口中都可以有方法声明和方法实现。
3、 抽象类和接口中的变量都不能初始化。
4、子类没有实现完抽象类中的抽象方法,接口实现类没有实现完接口没有方法体的接口方法,都将变为抽象类。
5、接口中、抽象类中的方法,都不能是私有(private)的。