【问题标题】:Inheritance in java and Superclasses(Object, Class)java中的继承和超类(对象,类)
【发布时间】:2011-05-26 01:05:59
【问题描述】:

所有自定义类/对象的java.lang.Object 超类是否隐式继承?我认为java不支持多重继承。我问的原因是我是否已经从自定义类中的另一个类继承,并且 java 再次强制隐式继承 java.lang.Object 在它之上,这不是多重继承吗?

另外,java.lang.class 类也是所有自定义类/对象的超类吗?如果没有,我们如何在 java 反射中获取传递的任何类的类的类型或在任何对象上调用 isInstance?

【问题讨论】:

    标签: java class object multiple-inheritance


    【解决方案1】:

    多重继承意味着一个类有多个直接前辈。如果 A 从 B 继承,B 从 C 继承,这不是多重继承。

    我不明白第二个问题(“java.lang.class Class”);您可能需要改写一下以澄清。

    【讨论】:

    • 当然,A..B..C 链的末端(在 Java 中)总是java.lang.Object。因为一个类要么是用超类定义的,要么它具有 Object 的隐式超类。遵循任何这样的继承链,你必须(因为循环继承不起作用)最终来到 Object。
    【解决方案2】:

    Object 是所有其他类的超类。当您的Child 类从您的Parent 类继承时,它不是Object 的子代,但它仍然是后代,因为它的父代是Object 的后代。 因此,如果您不指定超类/父级,它将自动为 Object。如果您确实指定了父类,那么Object 仍将是超类,因为根据定义它是父类的超类。

    Class 不是每个类的超类,但Object 类指定了一种通过getClass 方法获取每个类的Class 的方法。

    【讨论】:

      【解决方案3】:

      一切都是对象,也就是说你可以看到这样的结构:

      Object
      
      Animal
      
      Cat
      

      而不是这样:

      Object    Animal
      
            Cat
      

      Cat 扩展了两者,它不像最后一个例子,但它是 Cat extends Animalextends Object

      【讨论】:

      • 是编译器决定的吗?导致 Animal 或 Cat 都没有显式继承 Object。那么继承 Object 和 Cat 也继承 Object 呢?
      • 如果一个类没有明确地extends 另一个类,则假定为extends Object。我相信它是在编译时检查的,但我不确定。
      • 不是说“检查”,而是由 JVM“实现”和“提供”。
      【解决方案4】:

      每个没有显式超类的类都继承自java.lang.Object,而其他所有类都间接继承自它,因为当您沿着继承树向上时,您最终将在没有显式超类的类处结束,然后在Object处结束。

      java.lang.Class 是所有类对象(不是所有对象!)的超类,例如String.class

      【讨论】:

      • 更正:String.class 不是继承/扩展 java.lang.Class 的类/类型。它是 java.lang.Class 本身的instance。此外,java.lang.Class 是一个final 类;因此,它不能是任何东西的超类。 java.lang.Class 的功能是成为 java.lang.Object 的所有实例和子类(包括 java.lang.Class 本身)的 meta-data 提供者/描述符。class与每个类关联的字段(即String.class)是一个static,描述与该类关联的元数据的类级字段。
      【解决方案5】:

      你从自身继承的自定义类直接或隐式继承自Object,所以你间接继承自Object。链去YourObject -> MiddleObject -> java.lang.Object。不需要多重继承。

      多重继承是指直接从两个不相关的类继承。例如,如果您有一个直接继承自 CaninePoliceOfficer 的类 PoliceDog,那将是多重继承。

      【讨论】:

        【解决方案6】:

        是java.lang.Object所有的超类 继承的自定义类/对象 隐含的?

        小修正:关于以下表达式:

        所有custom class/objects的超类

        一个类 A 是另一个类 B 的超类。 B 的对象或实例 没有 A 作为它们的超类(因为它们是对象/对象实例,而不是类本身。)最合适的描述是这些对象是 B 类的实例,该类以 A 作为其超类。

        现在,关于java.lang.Object 的问题。它是所有可以被 java 运行时实例化的东西的超类。这包括两者:

        1. 您编写的类(自定义类),以及
        2. Java 语言本身提供的类。

        我以为java不支持多个 继承。

        它没有。它只支持单个class(或implementation)继承(结合多个interface(或type)继承。

        您将继承与类层次结构混淆了。请看下文。

        我问的原因是我是否已经 从我的另一个类继承 自定义类和java再次强制 隐式继承 java.lang.Object 在它上面,

        这对多重继承很好。假设您有一个从 Java 已经提供的类(例如 A 类)中编写的类 B。所以存在如下线性传递关系:

        java.lang.Object > A > B
        

        其中> 代表immediate parent of。任何从 Object 继承的类都只能有只有一个immediate parent。在任何时候,您都不会拥有一个 C 类,它对任何两个 A 类和 B 类的以下约束都不成立:

        forAll A, B { A > B -> forAll C { C > B C == A } }

        意思是,对于所有 A 和 B 类,使得 A 是 B 的 immediate parent,那么对于所有 C 类,C 只能是 B 的 immediate parent *当且仅当 C 本身就是 A。

        通过单继承,您可以(理论上)拥有无限的继承链A > B > C > ...,只要链中的每个类都在one and only one 直接父级之前。作为一个有用的类比,这类似于自然数中的 predecessor 关系 (0 preceedes 1 preceedes 2 which preceedes 3 ...)。

        免责声明:这不是您在日常编程生活活动中使用的东西。但是,准确地了解这些事物的内在含义将极大地帮助您了解面向对象。

        不是多重继承吗?

        否(见上文。)与单继承相反 - 如上所述 - 在多重继承中,您可以有多个直接父级(如在 C++ 中所见)。

        正如我们在上面的定义中注意到的,传递继承关系“>”是从一个类到另一个类。但是对于多重继承,关系是从一组超类{A} 到单个类{B}

         {A} > B -> forAll a {a in A <-> a > B}
        

        在 C++ 中,你可以有没有父类的类,那么集合 {A} 可以是空集。在java中,你也有多重继承,但仅限于interfaces(或类型)

        还有,是java.lang.class 类也是 所有自定义的超类 类/对象?

        没有。如果您访问在线提供的 Javadoc 手册,它将有助于您的学习。查一下。真的。

        如果没有,我们如何在 java 中反射 获取任何类的类类型 通过或调用 isInstance 在任何 对象?

        因为 java.lang.Class 的实例(以及 java 反射使用的所有类)是其他类的元数据描述符。这与继承无关。你在这里指的是meta-programming

        此外,java.lang.Class 是一个最终类;因此,它不能是任何东西的超类。

        java.lang.Class 的功能是成为 java.lang.Object 的所有实例和子类(包括 java.lang.Class 本身)的元数据提供者/描述符。与每个类关联的类字段( .ie. String.class) 是一个静态的类级字段,描述与该类关联的元数据。

        java.lang.Class 包含/描述的元数据包含方法、构造函数和字段的元数据访问器对象。同样,这与继承无关。

        继承 =/= 元编程。

        希望对你有帮助。

        【讨论】:

          【解决方案7】:

          这样的话,不是多继承而是多层次的 继承。
          例如,假设你有一个班级,动物班级, 此类将扩展 Object 类,默认情况下并扩展 no 其他课程。
          还让我们假设,你有一个类扩展 类动物,说类狮子。在这种情况下,Lion 班将不会 直接继承对象类,但由于它继承了类 Animal 继承了 Object 类,它也间接继承了 它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-09-30
            • 2020-10-09
            • 1970-01-01
            • 2015-03-14
            • 1970-01-01
            • 2013-10-16
            • 2012-06-25
            相关资源
            最近更新 更多