在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样?
动手做实验:
interface A{ void fun(); } interface B{ void fun(); } interface C extends A,B{ } public class Test implements C{ @Override public void fun() { System.out.println("hehe"); } public static void main(String[] args) { new Test().fun(); } }
上例的情况,可以正常编译运行,输出"hehe",因为A与B中的fun具有相同的签名(参数个数与类型相同)
interface A{ void fun(); } interface B{ int fun(int x); } interface C extends A,B{ } public class Test implements C{ @Override public void fun() { System.out.println("hehe"); } @Override public int fun(int x) { return 0; } public static void main(String[] args) { new Test().fun(); } }
上例也是可以编译运行的,因为A与B中的fun方法具有不同的函数签名,本质上是两个方法,分别实现即可。
interface A{ void fun(); } interface B{ int fun(); } interface C extends A,B{ } public class Test implements C{ @Override public void fun() { System.out.println("hehe"); } public static void main(String[] args) { new Test().fun(); } }
而这种具有相同函数签名,但不同返回值的方法,是没有办法编译的,接口C便已经无法编译。
在Java8中,接口可以具有默认的实现,这里再举几个实例
interface A{ default void fun() { System.out.println("I am A"); } } interface B{ default void fun() { System.out.println("I am B"); } } interface C extends A,B{ @Override default void fun() { System.out.println("I am C"); } } public class Test implements C{ public static void main(String[] args) { new Test().fun(); } }
上例将输出"I am C",因为接口C给出了fun的默认实现
interface A{ default void fun() { System.out.println("I am A"); } } interface B{ default void fun() { System.out.println("I am B"); } } interface C extends A,B{ @Override void fun(); } public class Test implements C{ @Override public void fun() { C.super.fun(); } public static void main(String[] args) { new Test().fun(); } }
上例将产生编译错误,因为C中对fun方法进行了覆盖,C的fun是抽象的,在第18行将产生无法访问C中抽象方法fun的编译错误。
interface A{ default void fun() { System.out.println("I am A"); } } interface B{ default void fun() { System.out.println("I am B"); } } interface C extends A,B{ @Override default void fun() { A.super.fun(); } } public class Test implements C{ public static void main(String[] args) { new Test().fun(); } }
接口C为fun方法指定为接口A中的实现,程序输出"I am A"
参考链接:
http://www.oschina.net/translate/java-8-explained-default-methods