【问题标题】:How does multiple inheritance in Java work? [duplicate]Java中的多重继承是如何工作的? [复制]
【发布时间】:2010-08-10 12:24:43
【问题描述】:

Object 是类层次结构的根。每个类都有Object 作为超类。那么,如果我要扩展一个 API 类,会不会是多重继承?显然,Java 不支持多重继承。那么它是如何工作的呢?

【问题讨论】:

    标签: java multiple-inheritance


    【解决方案1】:

    超类与父类不同。你只能有一个母亲,但你有更多的女性祖先。

    【讨论】:

    • 但是在支持多重继承的C++中,你可以拥有多个母亲吗?面向对象编程中“继承”一词的含义与生物学含义有很大不同;直接类比是行不通的。
    • 是的,在 C++ 中,可以有多个母亲,母亲关系类似于父类关系。我看不出这个比喻有什么问题。我的意思是,它内置在“父类”这个术语中。
    • 没错。你仍然可以有妈妈、爸爸、周末爸爸等。现实世界的类比有很多不同的可能性。
    • 术语“父类”也是错误的,因为它混淆了生物继承和面向对象的编程继承。在 OO 中,子类实例是超类的一个实例(Liskov 替换原则)。调用超类“Parent”和子类“Child”意味着你在说:“A Child is a Parent”。这没有任何意义。
    • 请注意,Java 语言规范中也没有使用术语“父类”;它在那里被称为“直接超类”。
    【解决方案2】:

    正如其他人所解释的那样,Java 不支持多重继承。
    但是当你实现多个接口时,你可以(有点)拥有多重继承:

    interface Moveable {
        void relocate(Coordinate position);
        Coordinate getCurrentPos();
    }
    
    interface Tradeable {
        void sell(BigInteger amount);
        void buy(BigInteger amount);
    }
    
    interface Crashable {
        void crash();
    }
    
    class Vehicle implements Moveable, Tradeable, Crashable {
    
    }
    

    现在Vehicle 应该来自它实现的接口的所有方法。

    【讨论】:

      【解决方案3】:

      不,Object 将只是您创建的任何类的最终父类

      多重继承意味着您可以编写一个扩展StringInteger 的类,并获得每个类的属性。 Java 无法做到这一点。如果这是你想做的事情,你可能想看看the Delegate pattern

      【讨论】:

        【解决方案4】:

        不,它只是继承,一切照旧

        grandparent
        
        parent
        
        child
        

        孩子只有一个父母, 并且父母有祖父母(没有逻辑意义,但无论如何:)

        多重继承是指你从两个不同的类继承时不需要彼此做任何事情

        donkey      car
        
             donkeycar
        

        (正如您已经指出的,这在 java 中是不可能的)

        【讨论】:

        • 我现在真的很想要一辆驴车... ;-)
        • 我很惊讶Java没有一种方便的方式来表示驴车......
        【解决方案5】:

        你的对象的超类也有一个超类等等。

        所有对象形成一棵以 java.lang.Object 作为根节点的树。

        【讨论】:

          【解决方案6】:

          没有。

          多重继承意味着你继承例如两个类

          class A {}
          
          class B {}
          
          class C extends A, B {}
          

          这在 Java 中是不可能的。

          你可以做的是

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

          所以你有不止一个超类,但只有一个父类。

          【讨论】:

            【解决方案7】:

            我的理解是多重继承水平地工作(多个父超类直接继承到一个子类中)而不是垂直地(父母的父母),考虑到继承树。

            正如你所说,Java 中只允许使用垂直类型。

            【讨论】:

              【解决方案8】:

              继承是可传递的。您扩展了一个 API 类,而该 API 类本身扩展了 Object。所以你间接地扩展了 Object.更短一点,如果 A 扩展 B,B 扩展 C,则 A 扩展 C。

              这不是多重继承。如果你愿意,“继承链”可以随心所欲。但归根结底,一切都以Object结尾。

              真正的多重继承将同时从两个不相关的类扩展。你不能在 Java 中做到这一点。

              【讨论】:

                猜你喜欢
                • 2015-01-23
                • 1970-01-01
                • 2017-03-12
                • 2014-03-17
                • 2017-07-05
                • 1970-01-01
                • 1970-01-01
                • 2016-08-24
                • 1970-01-01
                相关资源
                最近更新 更多