【问题标题】:Abstract classes and Multiple Inheritance抽象类和多重继承
【发布时间】:2016-11-05 04:31:55
【问题描述】:

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

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

【问题讨论】:

  • 我知道为什么 java 中不允许多重继承以及菱形问题,但是如果您在上面的示例中看到,这只是接口的实现方式,所以对此有疑问。彼得劳里还是回答了它:)
  • 我同意.. 请在下面查看我的 cmets。

标签: java interface abstract-class multiple-inheritance


【解决方案1】:

在抽象类中,我们不能一次扩展多个抽象类。 但 在INTERFACE中,我们可以同时实现多个接口。

因此,java中使用接口来实现多重继承。

【讨论】:

  • 不。实现接口与继承无关。在继承中,您也应该继承父母的行为。实现接口时,您只是“确保”您的类具有与接口相同的方法。
【解决方案2】:

我同意你的看法(如果我明白你在说什么 :))这不需要这种特定的命名约定。

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 个不同的引用。

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

【讨论】:

    【解决方案3】:

    这是不允许的,因为你可以用抽象类做更多的事情。如果您只在可以使用接口时才使用抽象类,那么允许多重继承是没有意义的。

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

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

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

    【讨论】:

    • “能够在接口中拥有私有方法”......真的!这是我第一次听到这个。因为我发现目前(J8)的情况很可笑:J8 接口中的“默认”方法可以访问状态......但只有静态(接口可以包含静态字段)。是不是应该让多重继承成为可能并“弃用”接口?并且简单地让编译器要求具有歧义的子类,嗯,解决这些歧义?
    • @mikerodent 我明白你的意思,但 Brian Goetz 最近表示状态只会在课堂上,所以我认为这种情况不会很快改变。状态并不打算在接口上,并且字段始终是最终的(尽管它们可以是可变的)
    【解决方案4】:

    这是因为抽象类仍然是类,继承不同于实现接口。请参阅the differences between abstract class and interface。另请参阅 Java 中的 differences between inplementing an interface and extending a class。

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

    另外让我举个例子,为什么不应该允许这样做:假设你有 Animals 和 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(),它不是抽象的,所以它可以直接使用它。这种方法对狗的回报是什么?将返回哪个字符串,带有 Animals 的字符串,还是带有 Animals1 的字符串?

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

    【讨论】:

    • 如果这些答案,回答相同的问题,你可以投票关闭它作为重复。
    • @PeterLawrey 如果需要两个答案来提供单个问题的信息,我是否应该投票结束该问题?当然,他可以通过阅读许多文章来找到他的问题的答案,但按照它的表述,我不认为他的问题是我建议的问题之一的“重复”。但我必须承认,我曾经想过同样的事情。
    • 当信息可用但仅通过组合两个答案时,我倾向于不关闭,而是将相关信息包含在新答案中,就像您现在所做的那样。
    • @PeterLawrey 我知道这可以讨论,而且我也认为可以按原样保留答案,因为对于遇到相同问题的任何人来说,这比关闭问题更有帮助.我认为这是值得的。
    • 我同意,一个组合的答案是值得补充的。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多