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

时间:2022-09-10 15:29:46

在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://*.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 中的集合接口——List、Set、Map

    Java 中的集合接口——List.Set.Map 什么叫集合:集合就是Java API所提供的一系列类的实例,可以用于动态存放多个对象.这跟我们学过的数组差不多,那为什么我们还要学集合,我们看看数组 ...

随机推荐

  1. 105 董婷婷 第一次Sprint总结

    总结: 经过一个多星期,第一次Sprint在今天结束了,在这次Sprint中我们的工作主要做的是对项目的构建及各种界面的设计和完善,一些比较具体的功能还没有实现.在这次Sprint中因为有上学期合作的 ...

  2. 关于js内部运行机制的一本好书

    读<单页Web应用一书>,第二章讲了js内部运行机制,感觉棒极了.之前读<你不知道的js>,看的云里雾里,似懂非懂.没想到单页Web一书将此内容讲的如此通俗易懂,好多困惑已久的 ...

  3. 04传智&lowbar;jbpm与OA项目&lowbar;部门模块改进&lowbar;直接在BaseAction中实现ModelDriven&lt&semi;T&gt&semi;

    这个项目是用Struts2做的,我这里单独写了一个BaseAction,用来存放所有的功能模块的Action的公共部分, 刚开始的做法是这个BaseAction只会继承ActionSupport 并不 ...

  4. win10窗口设置眼睛保护色

    经常电脑前坐着,习惯了豆沙色窗口(据说保护眼睛): 目标 记事本,ide,office等窗口颜色豆沙色:如下图 步骤 打开注册表:win+r 运行"regedit": 依次打开[H ...

  5. 【实&lpar;dou&rpar;力&lpar;bi&rpar;首&lpar;mai&rpar;发&lpar;meng&rpar;】第四次CCF软件能力认证题解

    这次的题总体上相对前三次偏简单.由于实力有限,就分析前四题.     试题编号:    201503-1 试题名称:    图像旋转 时间限制:    5.0s 内存限制:    256.0MB 问题 ...

  6. SQL Server 2005中的分区表(五):添加一个分区&lpar;转&rpar;

    所谓天下大事,分久必合,合久必分,对于分区表而言也一样.前面我们介绍过如何删除(合并)分区表中的一个分区,下面我们介绍一下如何为分区表添加一个分区. 为分区表添加一个分区,这种情况是时常会 发生的.比 ...

  7. oc语言学习之基础知识点介绍(三):类方法、封装以及继承的介绍

    一.类方法的使用 /* 像我们之前学的方法,必须先实例化这个类的对象才能调用这个方法,类方法不用实例化对象,直接调用这个方法. 之前学的方法调用的语法: [对象名 方法名]; //对象方法 类方法: ...

  8. C语言经典算法100例

    [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. ...

  9. Flask 扩展 HTTP认证

    Restful API不保存状态,无法依赖Cookie及Session来保存用户信息,自然也无法使用Flask-Login扩展来实现用户认证.所以这里,我们就要介绍另一个扩展,Flask-HTTPAu ...

  10. override与new的区别

    using System; namespace ConsoleAppDemo { class BaseClass { public void Fun() { Console.WriteLine(&qu ...