在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. wxWidgets 的 Linux / Windows 混合开发环境

    目标 建立一个开发 GUI 交互界面程序的环境,要求: 以 C/C++ 为主要程序设计语言. 最好能充分利用已有的 MFC 开发经验. 以 Linux 为主要开发环境.可以在 Windows 中编译并 ...

  2. QtQuick 中的 qml 与 Qt 的 C++

    QtQuick 可以使用内置的 JavaScript 引擎加载相应的 JS 代码,使用起来特别方便. 在 Qt 中使用 C++ 开发底层,QtQuick 用来加载.处理图像,然后使用 Qt 提供的接口 ...

  3. 解决!同一ajax请求获取的图片路劲,在谷歌浏览器能正确展示图片,在火狐浏览器则显示路径undefined

    今天的工作学习之路是解决了昨天的问题,可看我昨天的随笔了解问题. 非常感谢昨天各位积极地解答,在此我引用 @不带汽的可乐 的方法进行解决,问题其实挺简单就解决了,先说说原因,在火狐浏览器中,当我在js ...

  4. windows phone 8.1 FlipView 实现照片自动浏览

    FlipView 控件也是一个集合控件,不过它和ListView等控件不同,ListView控件是一次显示多个项,而FlipView则是每次只显示一个项.在windows phone上通过默认的左右滑 ...

  5. Fireworks快捷键大全和ps查看切图的坐标颜色

    记住后方便了许多

  6. 【VB超简单入门】五、基本输出输入

    之前讲了VB IDE的基本操作和概念,接下来要开始将VB语言的编程了. 程序最重要的部分是输出和输入,输入数据,经过计算机处理,再输出结果.本文将介绍两种最基本的输出输入方法,分别是Print.Msg ...

  7. iwebshop两表联查

    $tb_goods = new IQuery('goods as g'); $tb_goods->join='left join miao as m on m.goods_id=g.id'; $ ...

  8. python 附加作业01

    题目1: 画方块 输入样例: 10 a 输出样例: 代码: N=eval(input()) c=input() for i in range(N): for j in range(N): print( ...

  9. js简单省级联动菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 基于CDIF实现的——API在线自动化测试

    传统的测试工具在测试一个API的时候,必须手动填写这个API所需要接收的所有信息,比如一个查询航班动态的API,他接收两个输入字段,一个叫flight, 一个叫date,那么测试这个API的用户,需要 ...