抽象类和多重继承

时间:2016-07-03 07:48:22

标签: java interface abstract-class multiple-inheritance

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

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

5 个答案:

答案 0 :(得分:5)

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

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

注意:使用Java 8可以减少对接口的影响,可以使用实现的公共实例和静态方法。

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

答案 1 :(得分:0)

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

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

另外,让我举个例子说明为什么不允许这样做:假设您AnimalsAnimals1同时实现相同的接口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的字符串?

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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个不同的引用,就像我可以做的那样。

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

答案 4 :(得分:-1)

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

因此,接口用于在Java中实现多重继承。