【问题标题】:How can the Object class be a super class of subclasses?Object 类如何成为子类的超类?
【发布时间】:2019-02-06 07:41:07
【问题描述】:

事实 1:

Java 不支持多重继承。

事实 2:

对象是所有其他类的超类

如果我有一个类 Parent 和一个类 Child 继承类 Parent

class Parent {

}

class Child extends Parent {

}

在这种情况下,如果Java不支持多重继承,Child类将如何继承Object类?

这三者之间的关系是如何定义的?

选项 1:

选项 2:

【问题讨论】:

  • Object 是 Java 中每个类的超类。
  • @Arvind multilevel inheritancemultiple inheritance 不是一回事。 Java 支持multilevel inheritance,但 C++ 两者都支持。
  • 请不要在问题中发布答案/解决方案,但如果您认为这是您问题的真正解决方案,请随意编写新答案并将其标记为已接受。见stackoverflow.com/help/self-answer
  • @AbhishekKeshri 是的,你可以 - 只需使用下面的答案框。所有“自我回答”只是在问题字段上显示一个答案框。但是您是否需要发布答案?似乎已经有一个非常好的答案,您已经接受了。
  • @AntP 我将删除 Solution 部分。你的论点有道理。

标签: java oop inheritance multiple-inheritance


【解决方案1】:

这是选项 2。如果您定义一个超类,那将是您的类的直接超类。如果您没有定义一个,Object 将是直接超类。

class Parent {

}

class Child extends Parent {

}

等价于

class Parent extends Object {

}

class Child extends Parent {

}

因此,虽然Object 是所有类的超类,但在到达Object 之前,类层次结构中可能存在一些步骤。它不是所有类的直接超类。

【讨论】:

  • 不会class Child 也继承Object?不会是class Child extends Parent, Object(如果内部有可能的话!!!)?
  • @AbhishekKeshri No. Child 通过 Parent继承 Object。
【解决方案2】:

Object 可能不是直接父母,但它始终是超级父母。

Child extends Parent
Parent extends Object

 |
 V

Child [indirectly] extends Object

【讨论】:

  • @AbhishekKeshri 如果场景一是正确的,我们会遇到为子类选择方法的问题(因为ObjectParent extends Object都有相同的方法集包括equals,@ 987654326@等)
【解决方案3】:

JavaDoc 说:

Object 是类层次结构的根。 ...

如果一个类没有通过使用关键字extends 对其进行贴花来扩展任何其他类,它虽然隐含地从Object 扩展。

documentation 说:

在没有任何其他显式超类的情况下,每个类都是 隐式地是 Object 的子类。

参见JLS, chapter 8.1.4中的Example 8.1.4-1直接超类和子类

它表明class Point { int x, y; }是 Object 的直接子类

此外,文档说:

类可以派生自那些派生自以下类的类 派生自类,依此类推,最终派生自 最高级别,Object。据说这样一个阶级是所有人的后裔 继承链中的类回溯到Object

JLS 声明它简短而正式:

子类关系是直接的传递闭包 子类关系。

因此类Object是所有类的超类。

但是文档也说:

除了没有超类的Object,每个类都有一个且只有一个直接超类(单个 继承)。

继续以class ColoredPoint extends Point { int color; } 为例,“Point 的直接子类。”。通过传递关系,它是Object 类的(非直接)子类。

总结:
Object 要么是直接超类,要么是任何其他类的最后一个超类。

回答问题:

  • Java 不支持多重继承:它以传递的方式提供单一继承。每个类只直接扩展一个超类。
  • 关系如何:类Parent对应类Point,类Child对应类ColoredPointJLS例子。只有选项 2 显示了这种关系。

【讨论】:

    【解决方案4】:

    这是一个有趣的讨论。我认为这将是选项 2。就像您尝试以下代码一样。

    public static void main(String []args){
          Parent p=new Parent();
          Class c= p.getClass();
    
          Child child =new Child();
          Class c1= child.getClass();
          System.out.println(c.getSuperclass());
          System.out.println(c1.getSuperclass());
    
     }
    

    你会得到如下输出:

    class java.lang.Object 
    class Parent
    

    【讨论】:

    • 使用下面的代码解决了我的疑惑:Class child_super = c1.getSuperclass(); System.out.println(child_super.getSuperclass());
    【解决方案5】:

    选项 2,因为每个对象都派生 Object.class 方法

    【讨论】:

      【解决方案6】:

      正确答案是选项 2。任何 Java 类都为其父级继承所有父级。换句话说。

      A 类扩展 B 类 B 类扩展 C 类 C 类扩展 D 类

      X 类扩展 A -> 这意味着 A 继承了 B、C 和 D 的所有受保护/包/公共字段。

      在您的示例中,Class Child 继承 Parent 属性,但也继承 Object 传递模式的属性。

      【讨论】:

        【解决方案7】:

        来自Class Object

        public class Object
        类对象是类层次结构的根。
        每个类都有 Object 作为超类。
        所有对象,包括数组,都实现了这个类的方法。

        这意味着每个 Java 类都有 Object 作为层次结构中的根,不一定是它的直接父类。

        【讨论】:

          【解决方案8】:

          没有多重继承意味着在 Java 中一个类只能扩展 1 个类;有一个直接基类。间接地,一个类可以有许多祖先:Child 有 Parent 和 Object 作为祖先的“超级”类。

          Object --> Parent --> Child
                            --> OtherChild
          
          Relation: 1 --> N
          

          避免像在 C++ 中那样的多重继承的原因是涉及的歧义:

          假设多重继承的伪代码:

          class A : Comparable
          class B : Comparable
          
          class Child : A, B {
          
              @Override A? B?
              int compareTo(Child rhs) { ... super.compareTo ? ... }
          }
          
          A a = new Child();
          B b = new Child();
          a.compareTo(b);
          

          【讨论】:

          • 如果签名相同,我们为什么要关心重写哪个方法?压倒一切只是意味着我们对父母的行为不满意并希望实施我们的行为。问题是,当我们调用child.compareTo(anotherChild) 而不覆盖时会发生什么(我们将调用哪个方法?)
          • @AndrewTobilko 说得好; compareTo(a); compareTo(b), compareTo(child);实际上,我不想说任何关于多重继承(和接口)的事情,因为这超出了问题的范围。只是多重继承没有有祖传;相反,单一继承意味着每个类有一个(代码承载)父级。我也没有处理接口中的默认方法。
          【解决方案9】:

          首先,使用Java 8,可以完成Multiple inheritance using Default methods of interfaces

          其次,您对 Object 类的理解在“选项 2”中得到了正确表示。
          但是,它不是多重继承,而是多级继承。 “选项 1”是多重继承。

          请查看此link 以了解有关它们的更多信息。

          【讨论】:

            【解决方案10】:

            选项2.Object是所有其他类的超类,但Object可能不是一个类的直接超类。

            【讨论】:

              猜你喜欢
              • 2015-08-23
              • 1970-01-01
              • 2021-06-27
              • 2012-11-07
              • 2011-04-02
              • 1970-01-01
              • 1970-01-01
              • 2018-12-28
              • 2018-11-12
              相关资源
              最近更新 更多