本问将会对Java中接口的相关知识进行总结,主要包括:
- 什么是接口
- 怎么定义接口
- 接口与类的联系与区别
什么是接口
在总结Java中类的相关知识时讲到,无论是普通的类还是抽象类都不支持多继承,即一个子类只能有一个父类,但是有些时候必须重几个类中派生出一个子类,继承他们所有的属性和方法。使用接口(interface)就可以实现多继承的效果。
所谓的接口其实就是一种规范,定义的是一组规则,比如再使用usb传输数据时,电脑就需要安装相应的驱动才能进行数据传输。这体现时的现实生活中”如果要…就必须…”的思想。继承时一个”是不是”的关系,而接口实现的就是”能不能”的关系。
接口的本质时一种契约、规范、标准。使用了一个接口就必须遵从它的规范。
在Java中接口与类是并列的两个结构,即一个东西不能同时是同class关键字和interface关键字修饰。
定义接口
一个接口可以由以下部分组成
- 全局常量
- 抽象方法
- 静态方法
- 默认方法
注意:接口中没有构造器,以意味着接口是不可以实例化的!
1 | interface Flyable { |
- 在接口中每一个属性都会被定义为一个常量,所以在public static final是可以省略的。(只能是public static final,其他修饰符会报错)
- 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
- 接口中的静态方法和全局常量是可以通过接口进行调用的
1 | System.out.println(Flyable.MAX_SPEED); |
- 接口中的默认方法是可以在实现类中进行调用,但是不可以直接通过接口调用,且默认方法可以在实现类中进行重写,之后执行的就会使重写之后的方法。
- 如果实现了多个接口,而多个接口中定义了同名同参数的默认方法,在实现类没有重写此方法的情况下,会报错
- 如果子类继承父类和实现的接口中声明了同名同参数的方法,子类在没有重写的情况下,默认调用的是父类中的同名同参数的方法。这称为类优先原则
1 | class Traffic { |
1 | Plane plane = new Plane(); |
- 一个实现类可以同时实现多个接口,不同的接口之间用逗号隔开
1 | class AA implements CC, DD { |
接口的继承
接口同样是可以被继承的,且支持多继承
1 | interface AA{ |
如果此时对CC接口进行实现的话,需要对实现三个抽象方法:
1 | class DD implements CC{ |
类与接口
此外类与接口之间还有以下的区别
首先从他们的关系来看:
- 类与类之间: 继承关系,一个类只能直接继承一个父类,但是不支持多重继承
- 类与接口之间: 只有实现关系,一个类可以实现多个接口
- 接口与接口之间: 只有继承关系,一个接口可以继承多个接口
- 如果实现类覆盖接口中所有抽象方法,则此类就可以实例化
- 如果实现类没有覆盖接口中所有抽象方法,则此类需为抽象类
此外还有
- 组成部分来看,类可有构造器、属性、方法等,但是结构只有全局常量和抽象方法。
- 类是可以实例化的,只是抽象类不可以直接实例化,但是接口是不可以实例化的。
本文作者:
CodeWhat
本文链接: https://quandongli.github.io/post/8118b911.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
本文链接: https://quandongli.github.io/post/8118b911.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
