摘要 类 和多重继承

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");}
}

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

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

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

注意:使用 Java 8 时,您无法使用接口进行的操作更少,您可以使用 public 实例和静态方法实现。

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

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

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

另外让我给你举个例子为什么这不应该被允许:假设你有 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:

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

它也会有方法eat(),它不是抽象的,所以可以直接使用它。对于一只狗来说,这种方法的 return 是什么?哪个字符串将被 returned,带有 Animals 的字符串,还是带有 Animals1 的字符串?

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

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

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

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();
    }       
}

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

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

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

因此在java.

中使用接口来实现多重继承