码迷,mamicode.com
首页 > 编程语言 > 详细

关于Java中继承多接口同名方法的问题

时间:2016-06-20 06:49:39      阅读:336      评论:0      收藏:0      [点我收藏+]

标签:

在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://stackoverflow.com/questions/2801878/implementing-two-interfaces-in-a-class-with-same-method-which-interface-method

http://www.oschina.net/translate/java-8-explained-default-methods

关于Java中继承多接口同名方法的问题

标签:

原文地址:http://www.cnblogs.com/micrari/p/5599389.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!