当前位置: 首页 > 知识库问答 >
问题:

为什么Java不允许多个继承,而允许使用默认实现符合多个接口

甘兴学
2023-03-14

在Java中,不允许多重继承,但是在Java8之后,接口可以有默认方法(可以实现方法本身),就像抽象类一样。在此上下文中,还应该允许it多重继承。

interface TestInterface 
{ 
    // abstract method 
    public void square(int a); 

    // default method 
    default void show() 
    { 
      System.out.println("Default Method Executed"); 
    } 
} 

共有1个答案

席安康
2023-03-14

事情并不是那么简单。
如果一个类实现了多个接口,这些接口定义了具有相同签名的默认方法,编译器将强制您重写该类的此方法。

例如,使用以下两个接口:

public interface Foo {
    default void doThat() {
        // ...
    }
}

public interface Bar {    
    default void doThat() {
        // ...
    }       
}

它将不编译:

public class FooBar implements Foo, Bar{
}
public class FooBar implements Foo, Bar{    
    @Override
    public void doThat() {
        Bar.super.doThat();
    }    
}
public class FooBar implements Foo, Bar {
    @Override
    public void doThat() {
        Foo.super.doThat();
    }
}

或者仍然定义另一种行为:

public class FooBar implements Foo, Bar {
    @Override
    public void doThat() {
        // ... 
    }
}

这个约束表明Java不允许多个继承,甚至对于接口默认方法也是如此。

我认为我们不能对多重继承应用同样的逻辑,因为可能会出现多种问题,主要有:

    null
 类似资料:
  • 问题内容: Java不允许多重继承,但是它允许实现多个接口。为什么? 问题答案: 因为接口只指定什么类是做,而不是如何它是做什么的。 多重继承的问题在于,两个类可能定义不同的方式来做同一件事,而子类无法选择该选择哪一个。

  • 问题内容: 我知道Java和C#中不允许多重继承。许多书只是说,不允许多重继承。但是可以通过使用接口来实现。没有任何关于为什么不允许它的讨论。谁能确切告诉我为什么不允许这样做? 问题答案: 简短的答案是:因为语言设计师决定不这样做。 基本上,.NET和Java设计器似乎都不允许多重继承,因为他们认为添加MI会增加语言的复杂性,而带来的好处却很少。 要获得更有趣和深入的阅读,Web上提供了一些文章,

  • 问题内容: 我使用的是PHP,而MySQL使用的是PDO。有时我需要准备一个在此查询中多次使用一个变量(占位符)的语句。 例: 但是,如果我尝试准备该语句,则会出现错误,因此我需要采用以下方式: 要调用此语句,我将需要具有以下数组: 对我来说真是太蠢了!为什么MySQL(PDO?)不允许我多次使用一个占位符,并迫使我使用需要更多控制权的额外变量? 如果查询相对简单(如我在上面发布的内容),则可以轻

  • 问题内容: 我在PHP中运行一个脚本,该脚本uisng循环为MySQL创建了一个字符串查询。 执行脚本后,出现以下错误: “您的SQL语法有错误;请查看与您的MySQL服务器版本相对应的手册,以在’UPDATE BANNERS SET pos = 1 WHERE BID = 5; UPDATE BANNERS SET pos = 2 WHERE BID = 1’附近使用正确的语法。在第2行 在错误

  • 问题内容: 我想知道Java中是否有特殊原因总是使用“ ”而不是“ ”来定义类型参数的界限。 例: 被禁止但是 是正确的。是什么原因呢? 问题答案: 在类“实现”还是“扩展”之间,通用约束语言没有语义差异。约束可能性是“扩展”和“超级”-也就是说,该类是可分配给其他类的对象(扩展),还是该类可从该类分配(超级)。

  • 我们知道在面向对象编程的时候,比如Bird既有叫的功能,又有飞的功能,可以通过继承Animal和实现飞的接口的功能实现: 问题1: 为什么很多不使用多继承?而是选择继承类+实现接口? 这个有什么好处? 如果还有其他类的功能比如: 问题2: Bird想要继承吃素的功能,请问这个如何进行实现呢?就不能进行继承了对吗?