美文网首页
Java中接口的多继承

Java中接口的多继承

作者: 小北觅 | 来源:发表于2018-11-01 19:07 被阅读21次

我们知道Java的类只能继承一个类,但可以实现多个接口。但是你知道么?Java中的接口却可以继承多个接口。本文就来说一说Java中接口的多继承。

进入主题之前,先扩展一下。Java为什么只支持单继承呢?

我们不妨假设Java支持多继承,举个例子,在这里有个A类,我们又编写了两个类B类和C类,并且B类和C类分别继承了A类,并且对A类的同一个方法进行了覆盖。如果此时我们再次编写了一个D类,并且D类以多继承的方式同时集成了B类和C类,那么D类也会继承B类和C类从A类中重载的方法,如下图所示。那么问题来了,D类也开始犯迷糊了,我到底应该哪个继承哪个类中的方法呢,因为类是结构性的,这样就会造成结构上的混乱。这就是多继承的菱形继承问题。

同时我们知道C++是支持多继承的,因为它解决了这个问题(我对C++不太熟,查了下资料,好像是通过虚基类实现的吧)。但是Java本着简单的原则,舍弃了多继承。

好,进入正题。我们还是举个实例来演示一下接口的多继承。

燕子是鸟,鸟会飞,也会唱歌。我们来模仿一下:

一、会飞的接口

package multiex;

public interface Flyable {
    public void fly();
}

二、会唱歌的接口

package multiex;

public interface Singable  {
    public void sing();
}

三、鸟的接口
鸟的接口继承上面两个接口

package multiex;
//虽然这个接口没有定义方法,但是会继承下来两个方法
public interface Bird extends Flyable,Singable {

}

四、燕子类,实现鸟接口

package multiex;

//燕子类
public class Swallow implements Bird {

    @Override
    public void fly() {
        System.out.println("燕子会飞");
        
    }

    @Override
    public void sing() {
        System.out.println("燕子会唱歌");
    }
}

五、测试类

package multiex;

public class Main {
    
    public static void main(String[] args) {
        Swallow swallow = new Swallow();
        swallow.fly();
        swallow.sing();
    }
}

运行结果:


上面演示了接口的多继承,那么这里存在一个问题。如果多个接口中有重名的方法怎么办?比如如下:

package multiex;

interface A {
    void m();
}
//注意:方法返回值不一样
interface B {
    int m();
}

class C implements A, B {
    public void m() {
        System.out.println("void m()");
    }

    public int m() {
        System.out.println("int m()");
    }
}

public class Test {
    public static void main(String[] args) {
        C c1 = new C();
        c1.m();
    }
}

这时,编译将无法通过。如下图所示:


因为在Java中,
方法名+参数(不含返回值类型)唯一确定一个方法。
方法名+参数(不含返回值类型)唯一确定一个方法。
方法名+参数(不含返回值类型)唯一确定一个方法。

所以当返回值不同时,Java认为这还是同一个方法,会与其中一个接口的返回类型冲突。导致编译错误。

同理,当返回值相同时,那这完全就是同一个方法了,实现类实现一次这个方法就好了。如下图:

怎么样?同学你懂了没?

相关文章

  • java接口相关的

    突然发现好久没有更新了 写一点关于java接口的东东吧 关于接口 java中是禁止多继承的 所以要想实现多继承就得...

  • 接口与实现

    接口是比“abstract类”更抽象的类,在java中,类是单继承的,而接口可以实现多继承 接口包含接口声明和接口...

  • 继承

    java中对于继承,java只支持单继承。java虽然不直接支持多继承,但是可实现多接口。 1:成员变量。当子父类...

  • Java中接口的多继承

    我们知道Java的类只能继承一个类,但可以实现多个接口。但是你知道么?Java中的接口却可以继承多个接口。本文就来...

  • java中的接口多继承

    一般初学者只知道单继承多实现,其实还有多层继承这个关系,那就是接口与接口之间的多继承关系!下面做一个小demo演示...

  • JAVA常见问题总计 高级类特性1

    java类是否可以多继承,怎么实现多继承?答:java没有多继承,但可以通过接口的形式来达到多继承的目地。 我比较...

  • C++小知识点

    1.C++中类可以多继承 即一个子类继承多个父类,而在C#和java中,可以多继承多个接口,但是不能多继承多个基类...

  • Collection接口

    java中的java.util.Collection接口是集合的顶级接口,继承了Iterable接口,jdk中并没...

  • 07 Java的继承与多态

    继承 Java继承的实现(只支持单继承,而不是多继承,称为接口的多实现)多个类中存在相同属性和行为时,将这些内容抽...

  • 接口

    在java中,类是单继承,多实现的 接口作用:拓展类的功能 格式: interface 接口名{ } 注意问题...

网友评论

      本文标题:Java中接口的多继承

      本文链接:https://www.haomeiwen.com/subject/dzgxxqtx.html