猿问

为什么Java中没有多重继承,但允许实现多个接口?

为什么Java中没有多重继承,但允许实现多个接口?

Java不允许多重继承,但它允许实现多个接口。为什么?



慕无忌1623718
浏览 711回答 3
3回答

红糖糍粑

因为接口只指定什么全班都在做,而不是多么,怎样它在做这件事。多重继承的问题是两个类可能定义不同方式做同样的事情,子类不能选择哪一个。

喵喵时光机

我的一位大学老师这样对我解释说:假设我有一个类,一个是烤面包机,另一个类是核轰炸机。他们可能都有“黑暗”的背景。它们都有一个on()方法。(其中一个有OFF(),另一个没有)。如果我想创建一个这两个类的子类.如你所见,这是一个可能在我面前爆炸的问题。因此,其中一个主要问题是,如果您有两个父类,它们可能有相同特性的不同实现-或者可能有两个同名的不同特性,如我的讲师的例子中所示。然后,您必须决定您的子类将使用哪个子类。当然,有处理这个问题的方法-C+就是这样做的-但是Java的设计者认为这会使事情变得太复杂。但是,使用接口,您可以描述类能够做的事情,而不是借用另一个类的方法来做一些事情。与多个父类相比,多个接口导致需要解决的棘手冲突的可能性要小得多。

慕姐8265434

这个问题的答案在于java编译器的内部工作(构造函数链)。如果我们看到java编译器的内部工作:public class Bank {   public void printBankBalance(){     System.out.println("10k");   }}class SBI extends Bank{  public void printBankBalance(){     System.out.println("20k");   }}编译后,如下所示:public class Bank {   public Bank(){    super();   }   public void printBankBalance(){     System.out.println("10k");   }}class SBI extends Bank {  SBI(){    super();  }  public void printBankBalance(){     System.out.println("20k");   }}当我们扩展类并创建它的一个对象时,一个构造器链将运行到Object班级,等级。以上代码运行良好。但是如果我们有另一个类Car扩展Bank还有一个杂交(多重继承)类调用SBICar:class Car extends Bank {   Car() {     super();   }   public void run(){     System.out.println("99Km/h");   }}class SBICar extends Bank, Car {   SBICar() {     super(); //NOTE: compile time ambiguity.   }   public void run() {     System.out.println("99Km/h");   }   public void printBankBalance(){     System.out.println("20k");   }}在这种情况下(SBICar)将无法创建构造函数链(编译时间歧义).对于接口,这是允许的,因为我们不能创建它的对象。对于新的概念default和static方法请参阅默认接口.希望这将解决您的查询。谢谢。
随时随地看视频慕课网APP
我要回答