在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://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中继承多接口同名方法的问题的更多相关文章

  1. 对java中继承、接口、组合的思考

    1.在c++中有继承和多重继承,而java中只有单继承.继承的好处在于可以复用一些东西,但缺陷在于后续不好扩展.此外,可读性方面继承也不好. 2.java中多了一个接口的概念,而接口的功能和其名字表达 ...

  2. java中继承thread类的其他类的start()方法与run()方法

    java中继承thread或者实现runnable接口的类必须重写run()方法. 如果其执行了start()方法,其实就是启动了线程的run()方法. 注意:如果是实现runnable接口的类是没有 ...

  3. Java中的(构造方法、方法重载、final修饰符使用及继承和抽象)

    构造方法: 构造方法的名称和类名相同,没有返回类型,参数列表(类型.个数)不同 方法重载:成员方法和构造方法都可以进行重载 方法名相同但是参数列表(类型,个数)不同,成为方法的重载. 继承:直支持单继 ...

  4. Java中各种(类、方法、属性)访问修饰符与修饰符的说明

    类: 访问修饰符 修饰符 class 类名称 extends 父类名称 implement 接口名称 (访问修饰符与修饰符的位置可以互换) 访问修饰符 名称 说明 备注 public 可以被本项目的所 ...

  5. Java 中extends与implements使用方法

    Java 中extends与implements使用方法 标签: javaclassinterfacestring语言c 2011-04-14 14:57 33314人阅读 评论(7) 收藏 举报 分 ...

  6. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  7. 关于JAVA中抽象类和接口的区别辨析

    今天主要整理一下新学习的有关于Java中抽象类和接口的相关知识和个人理解. 1 抽象类 用来描述事物的一般状态和行为,然后在其子类中去实现这些状态和行为.也就是说,抽象类中的方法,需要在子类中进行重写 ...

  8. Java中继承,类的高级概念的知识点

    1. 继承含义 在面向对象编程中,可以通过扩展一个已有的类,并继承该类的属性和行为,来创建一个新的类,这种方式称为继承(inheritance). 2. 继承的优点 A.代码的可重用性 B.子类可以扩 ...

  9. 用好JAVA中的函数式接口,轻松从通用代码框架中剥离掉业务定制逻辑

    大家好,又见面了. 今天我们一起聊一聊JAVA中的函数式接口.那我们首先要知道啥是函数式接口.它和JAVA中普通的接口有啥区别?其实函数式接口也是一个Interface类,是一种比较特殊的接口类,这个 ...

随机推荐

  1. JAVA基础:求一个数组的中心元素

  2. Ajax页面的加载数据与删除

    1.数据库找一张表: 颜色表2.主页面主页面的代码用到tbody:TBODY作用是:可以控制表格分行下载,从而提高下载速度.(网页的打开是先表格的的内容全部下载完毕后,才显示出来,分行下载可以先显示部 ...

  3. wemall app商城源码Android中ViewHolder详细解释

    1.ViewHolder的解释: (1).只是一个静态类,不是Android的API方法. (2).它的作用就在于减少不必要的调用findViewById,然后把对底下的控件引用存在ViewHolde ...

  4. 1935: [Shoi2007]Tree 园丁的烦恼

    1935: [Shoi2007]Tree 园丁的烦恼 Time Limit: 15 Sec  Memory Limit: 357 MBSubmit: 648  Solved: 273[Submit][ ...

  5. 一个服务器启动多个tomcat(详细图解)

    1.官网下载一个tomcat,复制一个副本(第二个tomcat) 2.添加2个环境变量(右键单击我的电脑->选择属性->选择高级->选择环境变量),是2个tomcat的位置,环境变量 ...

  6. 关于java泛型

    <T> 代表的是泛型 ,实例化的时候将传入真正的数据类型,比如: public interface BaseProvider<T>{ public T test(); } 实例 ...

  7. SEO-长尾词与分词技术

        长尾关键词与分词技术 长尾关键词:网站非目标关键词,能给网站带来流量的关键词. 例如:主关键词是成都网站建设 那么,跟成都网站建设相关的词,就叫做长尾关键词. 比如:成都网站建设哪里好?成都网 ...

  8. Caused by: java.lang.RuntimeException: java.io.IOException: invalid constant type: 18

    工程启动的时候有报下面这个错误的,更新下工程的jar包依赖,然后在工程的pom文件里加上下面的jar包 Caused by: java.lang.RuntimeException: java.io.I ...

  9. Android Weekly Notes Issue #248

    Android Weekly Issue #248 March 5th, 2017 Android Weekly Issue #248. 本期内容包括: 为什么有时候应该让你的应用崩溃(而不是一味保护 ...

  10. mybatis基础学习3---特殊sql语句(备忘)

    1: 2: 3:resultMap的用法