概述
初学Java的时候经常都能看到--Java类不能继承多个类,但是可以实现多个接口。
学了一段时间之后突然发现:原来接口还能继承接口。
再过一段时间可能终于发现:接口可以继承多个接口!
其实也是在情理之中,因为Java不支持继承多个类一定程度上是因为继承多个类而多个类拥有相同的方法的问题。但是接口不一样,一般来说接口里都是抽象类,所以不存在类的具体实现,就算多继承的时候有相同名字的方法也无所谓(JDK1.8中接口也可以有默认的的方法实现)
实例:
自定义的接口:
public class MutiInterfaceTest implements MyInterface{
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
}
interface MyInterface1 {
void method1();
}
interface MyInterface2 {
void method2();
}
interface MyInterface extends MyInterface1, MyInterface2{
void method3();
}
可以看到接口确实可以多继承。
那么加入有相同名字的方法呢?
在MyInterface1里面增加一个void method2():
public class MutiInterfaceTest implements MyInterface{
@Override
public void method1() {
}
@Override
public void method2() {
}
@Override
public void method3() {
}
}
interface MyInterface1 {
void method1();
void method2();
}
interface MyInterface2 {
void method2();
}
interface MyInterface extends MyInterface1, MyInterface2{
void method3();
}
编译没有报错。说明可以有重复的方法(毕竟都没有实现)。
那么问题来了,在JDK1.8中使用default来定义同名的默认实现的方法:
当一个接口中定义默认实现的方法而另一个接口中还是抽象方法会怎么样?(直接使用默认实现还是编译报错?)
当两个接口中都定义了同名的默认实现方法会怎么样?
测试:
第一种情况,MyInterface1中使用default实现一个method方法,MyInterface2中则为抽象方法:
interface MyInterface1 {
default void method() {
System.out.println("MyInterface1 method2 run");
};
}
interface MyInterface2 {
void method();
}
interface MyInterface extends MyInterface1, MyInterface2{
}
这个时候编译器报错:
很明显错误信息说的是有冲突。
再看看Eclipse给的解决方案:
第一种方案是说在MyInterface2中实现method。
点击之后生成的代码:
interface MyInterface extends MyInterface1, MyInterface2{
@Override
default void method() {
}
}
很直接,就是全都覆盖掉,重新实现。
第二种方案:
interface MyInterface extends MyInterface1, MyInterface2{
@Override
default void method() {
MyInterface1.super.method();
}
}
通过MyInterface1.super.method();直接使用MyInterface中已经实现了的method方法。
实例测试:
public class MutiInterfaceTest implements MyInterface {
public static void main(String[] args) {
new MutiInterfaceTest().method();
}
}
interface MyInterface1 {
default void method() {
System.out.println("MyInterface1 method run");
};
}
interface MyInterface2 {
void method();
}
interface MyInterface extends MyInterface1, MyInterface2{
@Override
default void method() {
MyInterface1.super.method();
}
}
输出:
MyInterface1 method2 run
interface MyInterface1 {
default void method() {
System.out.println("MyInterface1 method run");
};
}
interface MyInterface2 {
default void method() {
System.out.println("MyInterface2 method run");
};
}
interface MyInterface extends MyInterface1, MyInterface2{
}
编译器报错:
虽然错误信息不一样了,但是意思基本是一个意思,就是说有重复名字的默认方法实现
同样下面的方案很明显也是让我们可以二选一的意思
选择第一个:
interface MyInterface extends MyInterface1, MyInterface2{
@Override
default void method() {
MyInterface1.super.method();
}
}
跟前面一样,同样我们也可以随意的修改这个方法体内部的实现。
小结
- Java中的接口可以继承多个接口
- 被继承的接口中有同名方法:
都是抽象方法:没有任何问题。其中包含了default修饰的方法(JDK1.8特性):必须在子接口中重写该方法,同时可以通过MyInterface1.super.method();的方式调用默认实现。其中如果有static方法:static方法单独存在。可以重名。