在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. [HDU1282]回文数猜想

    Problem Description 一 个正整数,如果从左向右读(称之为正序数)和从右向左读(称之为倒序数)是一样的,这样的数就叫回文数.任取一个正整数,如果不是回文数,将该数与他的倒 序数相加, ...

  2. (原创)我对未来的人类的发展,以及AI技术发展的一些思考。

    最近AI非常的火,不仅仅是阿尔法狗的成功,因为它击败了人类最强的大脑,颠覆了人类几千年来的对传统的认识,也让人类意识 到了一个问题:天外有天,人外有AI. 那么AI究竟会对人类的未来造成什么深远的影响 ...

  3. 深入理解ajax系列第四篇——FormData

    前面的话 现代Web应用中频繁使用的一项功能就是表单数据的序列化,XMLHttpRequest 2级为此定义了FormData类型.FormData为序列化表单以及创建与表单格式相同的数据提供了便利. ...

  4. 浅谈Java的集合框架

    浅谈Java的集合框架 一.    初识集合 重所周知,Java有四大集合框架群,Set.List.Queue和Map.四种集合的关注点不同,Set 关注事物的唯一性,List 关注事物的索引列表,Q ...

  5. Java设计模式之《调停者模式》及应用场景

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6518603.html 调停者模式. 我们想象一下这样的场景:一个系统内部通过许多的类互相之 ...

  6. 理解云计算的(IaaS PaaS SaaS)

    本文不经允许,不得转载! 云计算技术已经慢慢普及了.我们做技术的有必要学习云计算技术. IaaS:Infrastructure-as-a-Service(基础设施即服务)云计算到来之前,很多企业都是自 ...

  7. .NET中可空值类型实现原理

    为了让.Net中的值类型可以赋值为null,微软特地添加了Nullable<T>类型,也可简写为T?.但是Nullable<T>自身是结构体,也是值类型,那么它是如何实现将nu ...

  8. Java 8并发工具包漫游指南

    Java 8并发工具包简介 Java 8并发工具包由3个包组成,分别是java.util.concurrent.java.util.concurrent.atomic和java.util.concur ...

  9. js提交表单错误:document.form.submit() is not a function

    今天在写JS时,遇上这么个错误:"document.form.submit() is not a function",经过一番搜索,最终找到了修复方法. 这个错误一般是由于表单&l ...

  10. C++标准库之queue(各函数及其使用全)

    原创作品,转载请注明出处:http://www.cnblogs.com/shrimp-can/p/5283520.html 一.FIFO队列,即先入先出队列 1.队列的声明 std::deque< ...