关于java中继承多接口实现其中同名方法的问题

在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样?

动手做实验:

复制代码
 1 interface A{
 2     void fun();
 3 }
 4 interface B{
 5     void fun();
 6 }
 7 interface C extends A,B{
 8 
 9 }
10 public class Test implements C{
11     @Override
12     public void fun() {
13         System.out.println("hehe");
14     }
15 
16     public static void main(String[] args) {
17         new Test().fun();
18     }
19 }
复制代码

上例的情况,可以正常编译运行,输出"hehe",因为A与B中的fun具有相同的签名(参数个数与类型相同)

复制代码
 1 interface A{
 2     void fun();
 3 }
 4 interface B{
 5     int fun(int x);
 6 }
 7 interface C extends A,B{
 8 
 9 }
10 public class Test implements C{
11     @Override
12     public void fun() {
13         System.out.println("hehe");
14     }
15 
16     @Override
17     public int fun(int x) {
18         return 0;
19     }
20 
21     public static void main(String[] args) {
22         new Test().fun();
23     }
24 }
复制代码

上例也是可以编译运行的,因为A与B中的fun方法具有不同的函数签名,本质上是两个方法,分别实现即可。

复制代码
 1 interface A{
 2     void fun();
 3 }
 4 interface B{
 5     int fun();
 6 }
 7 interface C extends A,B{
 8 
 9 }
10 public class Test implements C{
11     @Override
12     public void fun() {
13         System.out.println("hehe");
14     }
15 
16     public static void main(String[] args) {
17         new Test().fun();
18     }
19 }
复制代码

而这种具有相同函数签名,但不同返回值的方法,是没有办法编译的,接口C便已经无法编译。

 

在Java8中,接口可以具有默认的实现,这里再举几个实例

复制代码
 1 interface A{
 2     default void fun() {
 3         System.out.println("I am A");
 4     }
 5 }
 6 interface B{
 7     default void fun() {
 8         System.out.println("I am B");
 9     }
10 }
11 interface C extends A,B{
12     @Override
13     default void fun() {
14         System.out.println("I am C");
15     }
16 }
17 public class Test implements C{
18 
19     public static void main(String[] args) {
20         new Test().fun();
21     }
22 }
复制代码

上例将输出"I am C",因为接口C给出了fun的默认实现

复制代码
 1 interface A{
 2     default void fun() {
 3         System.out.println("I am A");
 4     }
 5 }
 6 interface B{
 7     default void fun() {
 8         System.out.println("I am B");
 9     }
10 }
11 interface C extends A,B{
12     @Override
13     void fun();
14 }
15 public class Test implements C{
16     @Override
17     public void fun() {
18         C.super.fun();
19     }
20 
21     public static void main(String[] args) {
22         new Test().fun();
23     }
24 }
复制代码

上例将产生编译错误,因为C中对fun方法进行了覆盖,C的fun是抽象的,在第18行将产生无法访问C中抽象方法fun的编译错误。

复制代码
 1 interface A{
 2     default void fun() {
 3         System.out.println("I am A");
 4     }
 5 }
 6 interface B{
 7     default void fun() {
 8         System.out.println("I am B");
 9     }
10 }
11 interface C extends A,B{
12     @Override
13     default void fun() {
14         A.super.fun();
15     }
16 }
17 public class Test implements C{
18 
19     public static void main(String[] args) {
20         new Test().fun();
21     }
22 }
复制代码

接口C为fun方法指定为接口A中的实现,程序输出"I am A"

猜你喜欢

转载自blog.csdn.net/qq_22339457/article/details/52664395