它是多重继承吗?如果不是为什么?

时间:2013-09-05 08:28:05

标签: java multiple-inheritance

public interface A {
    class Aclass {
        int constants = 100;
        public void display()
        {
            System.out.println("Inside A");
        }
    }
    public void display();

}
public interface B {
    class Bclass {
        int constants = 130;

        public void display() {
            System.out.println("Inside B");
        }
    }
    public void display();
}

public class MultipleInheritance implements A, B {

    @Override
    public void display() {
        A.Aclass a = new A.Aclass();
        System.out.println(a.constants);
        B.Bclass b = new B.Bclass();
        System.out.println(b.constants);
    }

    public static void main(String args[]) {

        new MultipleInheritance().display();
    }
}

尽管它是通过接口而不是通过上下文中的具体类而不是继承任何东西,但仍然不是代码重用,即使保持内部类很难但仍然充当多重继承请清除如果可能的话,用记忆表示。

4 个答案:

答案 0 :(得分:5)

让我们回顾一下您在代码中实际拥有的内容。在这里,您声明接口A和嵌套类AClass

public interface A {
    class Aclass {
        int constants = 100;
        public void display()
        {
            System.out.println("Inside A");
        }
    }
    public void display();
}

在此声明接口B和嵌套类Bclass

public interface B {
    class Bclass {
        int constants = 130;

        public void display() {
            System.out.println("Inside B");
        }
    }
    public void display();
}

在此实例化Aclass

A.Aclass a = new A.Aclass();

在这里你实例化Bclass

B.Bclass b = new B.Bclass();

现在请注意,AclassBclass是两个完全不相关的类。这两个共享的唯一常见超类型是Object

显然,在你甚至没有尝试从两种类型继承的情况下,不会谈论多重继承。

这里至少尝试涉及两种超类型:

public class MultipleInheritance implements A, B { ... }

但是你从不在代码中涉及这种类型,它只是main方法的容器。这种类型在实现两个接口时不会多次从它们继承:它继承了两种不同的类型(AclassBclass)。还要注意,即使它们具有相同的名称,仍然没有多重继承。只会发生命名冲突。

多重继承完全是关于方法实现的继承,显然你无法在Java中实现这一点。

答案 1 :(得分:1)

java不支持类的多个继承。但是你可以实现几个interfaces,这不被视为多重继承。

也请关注此链接。 Why is there no multiple inheritance in Java, but implementing multiple interfaces is allowed?

答案 2 :(得分:0)

这不是多重继承,但这是模拟相同的。 在java中不允许多重继承的原因是Diamond问题,在接口see的情况下不会发生这种情况 这是为了更多信息

答案 3 :(得分:0)

这不是多重继承,因为您没有通过超类调用子类的实例,如下所示:

A a = new MultipleInheritance(); 
a.display();

即使你这样做,也没有混淆,因为编译器会查找变量的类型,即 A 而不是 MulipleInheritance ,以查看变量的有效性。调用

编译器没有抱怨有两个 display()方法的原因是因为它知道它使用哪个(A或B中的那个)并不重要,因为它们都是空的。这避免了A和B bean类可能导致的混淆,如C ++中那样。