有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

从Java中的多个类继承(可能不使用接口)

假设我们有A、B和C类,我想继承所有这些类,还有另一个名为D的类,可以使用Java中的实现和接口来实现。但是假设我们不想使用这个简单的解决方案,那么在Java中,您能以任何其他方式从类A、B和C继承类D吗

(这个问题可能与设计模式有关,是在午餐讨论设计模式时向我的同事提出质疑后提出的)我认为除了使用多个接口之外,Java中没有其他方法可以实现多重继承


共 (6) 个答案

  1. # 1 楼答案

    Java中的类只能从一个类继承(如果不指定基类,则为java.lang.Object)。从三个类继承的唯一方法是,如果它们在一个链中相互继承:

    class A {}
    class B extends A {}
    class C extends B {}
    class D extends C {}
    

    现在,您的D类继承自ABC,但我怀疑这是您想要的

    Java中惯用的解决方案是实现多个接口,而不是继承多个类。如果必须“继承”实现,请使用组合而不是继承

    interface IA {}
    interface IB {}
    interface IC {}
    class A implements IA {}
    class B implements IB {}
    class C implements IC {}
    class D implements IA, IB, IC {
        A a = ...;
        B b = ...;
        C c = ...;
        // Implementations of methods from IA, IB, and IC
        // need to forward the calls to a, b, and c
    }
    
  2. # 2 楼答案

    多重继承是不可能的

    无论如何,您可以尝试用composition模拟这种继承

    JB Nizet在提供的链接中回答了您的问题

  3. # 3 楼答案

    不是。多重继承的Java方法是使用接口

  4. # 4 楼答案

    答案是否定的。多个接口不是多重继承。接口和类是不同的概念

    类是对象的定义,作为接口,对象必须遵循契约

  5. # 5 楼答案

    Java不支持class D extends A, B, C意义上的多重继承。正如拉纳鲁所提到的,实现这一点的首选方法是使用接口

    否则,你可以这样做:

    public class A {}
    public class B extends A {}
    public class C extends B {}
    public class D extends C {}
    

    实际上,D将通过C间接扩展AB

  6. # 6 楼答案

    在JavaSE8中,接口的实现可能有限。这提供了一种实现的多重继承形式

    作为多重继承的替代方案,内部类可以执行类似的工作

    class Derived extends BaseOne {
        ... fields ...
        private class InnerTwo extends BaseTwo {
            ... code with access to Derived's fields ...
        }
    }
    

    如果从BaseOne重写的方法需要调用BaseTwo的方法,它们将需要对内部类的显式引用,但不是相反,并且Derived字段是共享的