繁体   English   中英

抽象类和多重继承

[英]Abstract classes and 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");}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM