抽象类和多重inheritance

我们可以通过使用抽象类来实现与接口相同的function,那么为什么java不允许以下代码呢?

abstract class Animals { public abstract void run(); } abstract class Animals1 { public abstract void run1(); } class Dog extends Animals,Animals1 { public void run() {System.out.println("Run method");} public void run1() {System.out.println("Run1 method");} } 

我知道只使用接口可以实现多重inheritance,但上面的代码与接口完成的工作完全相同。

这是不允许的,因为你可以使用抽象类做更多的事情。 允许多重inheritance是没有意义的,只要您在使用接口时只使用了抽象类。

仅对接口无法使用的抽象类更简单,在这种情况下,您将无法使用两个抽象父类。

注意:使用Java 8,您无法使用接口,您可以使用实现的公共实例和静态方法。

在Java 9中,您将能够在接口中使用private方法;)

Java不支持多重inheritance。 – “Java编程语言不允许扩展多个类的一个原因是为了避免状态的多重inheritance问题,这是从多个类inheritance字段的能力。”来源https://docs.oracle .com / javase / tutorial / java / IandI / multipleinheritance.html您可能会发现此链接很有用。

这是因为抽象类仍然是类,inheritance与实现接口不同。 请参阅抽象类和接口之间的区别 。 另请参阅补充接口和扩展 Java 类之间的区别 。

这两个问题涵盖了您需要了解的所有信息,以了解为什么您不能拥有抽象类的多重inheritance。

另外,让我举个例子说明为什么不允许这样做:假设你有AnimalsAnimals Animals1实现相同的接口IAnimals

 interface IAnimals { public string eat(); } abstract class Animals implements IAnimals { public abstract void run(); public string eat(){ return "Animals eating"; } } abstract class Animals1 implements IAnimals { public abstract void run1(); public string eat(){ return "Animals1 eating"; } } 

如果你现在像你一样定义你的Dog类:

 class Dog extends Animals,Animals1 { public void run() {System.out.println("Run method");} public void run1() {System.out.println("Run1 method");} } 

它也有方法eat() ,它不是抽象的,所以它可以直接使用它。 这种方法对狗的回报是什么? 将返回哪个字符串,带动物的字符串或带有Animals1的字符串?

这被称为钻石问题 ,这就是为什么在某些编程语言中不允许多重inheritance的原因。

我同意你的意见(如果我理解你在说什么:))这不需要这样的特定命名约定。

 interface pet { public abstract void pet(); } interface pet1 { public abstract void pet1(); } class TestTt implements pet,pet1 { public void pet() { System.out.println("this is method of pet interface"); } public void pet1() { System.out.println("this is method of pet1 interface"); } public static void main(String a[]) { pet obj=new TestTt(); pet1 obj1=new TestTt(); obj.pet(); obj1.pet1(); } } 

现在,如果抽象类允许我创建对象。那么,我可以为2个抽象类创建2个不同的引用,就像我可以做的那样。

如果是这样,我需要接口……?