抽象类和多重继承

新手上路,请多包涵

我们可以通过使用抽象类来实现与接口相同的功能,那么为什么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");}
}

我知道多重继承可以通过仅使用接口来实现,但是上面的代码做的事情与接口做的一样。

原文由 Zephyr 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 487
2 个回答

这是不允许的,因为您可以使用抽象类做更多的事情。允许多重继承是没有意义的,前提是当您可以使用接口时只使用了抽象类。

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

注意:在 Java 8 中,你不能用接口做的事情更少了,你可以拥有带有实现的公共实例和静态方法。

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

原文由 Peter Lawrey 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是因为抽象类仍然是类,继承不同于实现接口。请看 抽象类和接口的区别。另请参阅在 Java 中 实现接口和扩展类之间的区别

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

另外让我给你一个例子,为什么这不应该被允许:假设你有两个 AnimalsAnimals1 实现相同的接口 IAnimals :05–

 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() ,这不是抽象的,所以它可以直接使用它。这种方法对狗的回报是什么?将返回哪个字符串,带有 Animals 的字符串还是带有 Animals1 的字符串?

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

原文由 meJustAndrew 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题