【问题标题】:Is it a Multiple Inheritance?If not why?它是多重继承吗?如果不是,为什么?
【发布时间】:2013-09-05 08:28:05
【问题描述】:
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();
    }
}

虽然它是通过接口而不是通过上下文中的具体类,你没有继承任何东西,但它仍然不是代码重用,即使维护内部类很困难,但它仍然充当多重继承,请清除如果可能的话,使用内存表示。

【问题讨论】:

  • 那里没有多重继承。所以不是。
  • 但是一个接口仍然像一个抽象类,一切都是最终静态的(只是语法不同但行为相同)。请这是面试官的一个非常热门的问题。
  • 您可能需要查看 Java 文档中的 "Abstract Classes versus Interfaces""Interfaces and Multiple Inheritance" 部分。
  • 好的,我们只有声明来告诉类它在实现接口的方法时应该遵守什么,并且仍然是只有方法声明的抽象类。

标签: java multiple-inheritance


【解决方案1】:

让我们回顾一下您的代码中实际包含的内容。在这里你声明接口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中实现。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-21
          相关资源
          最近更新 更多