在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"
参考链接:
http://www.oschina.net/translate/java-8-explained-default-methods
时间: 2024-10-24 03:10:23