关于java:抽象类和多重继承

Abstract classes and Multiple Inheritance

我们可以通过使用抽象类实现与接口相同的功能,那么为什么Java不允许使用下面的代码?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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中,您将能够在接口中拥有EDCOX1和0种方法;


我同意你的观点(如果我理解你所说的话:)这不需要这种特定的命名约定。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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个不同的引用,就像在接口中一样。

如果是,我需要接口吗…?


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


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

这两个问题涵盖了理解抽象类为什么不能有多个继承所需的所有信息。

另外,我给您举一个不允许这样做的例子:假设您让AnimalsAnimals1实现相同的接口IAnimals

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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类:

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

它也将使用方法eat(),这不是抽象的,因此可以直接使用它。这种方法对狗的回报是什么?将返回哪个字符串,带动物的字符串,还是带动物的字符串1?

这被称为菱形问题,这也是某些编程语言不允许多重继承的原因。