3
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

4 回答 4

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

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

显然,在您甚至不尝试从两种类型继承的情况下,就不能谈论多重继承。

在这里,您至少尝试涉及两个超类型:

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

但是您永远不会在代码中涉及这种类型,它只是该main方法的容器。这种类型虽然实现了两个接口,但不会从它们继承任何东西:它继承了两种不同的类型(Aclass, Bclass)。另请注意,即使它们具有相同的名称,仍然不会有多重继承。只会发生命名冲突。

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

于 2013-09-05T08:49:59.140 回答
1

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

也关注这个链接。为什么Java中没有多重继承,却允许实现多个接口?

于 2013-09-05T08:31:24.473 回答
0

这不是多重继承,但这是相同的模拟。不允许在 java 中进行多重继承的原因是 Diamond 问题,在接口的情况下不会发生,请参阅 此以获取更多信息

于 2013-09-05T08:43:51.930 回答
0

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

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

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

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

于 2013-09-05T08:48:34.777 回答