java.lang.Class和java.lang.Object

java.lang.Class和java.lang.Object,java,multiple-inheritance,Java,Multiple Inheritance,好的,这里有概念上的困难-从一本书中阅读和学习Java 它提到以下内容(在解释几个不同主题的过程中)—— Java不支持类层次结构中的多重继承。因此,如果类C是类a的子类,那么它不可能也是类B的子类(我知道接口在这里提供了一个解决方案) java.lang.Object是所有类(系统和用户)“扩展”的原始类。因此,每个类都是类java.lang.Object Java中的类不仅是编译器人工制品,而且在运行时由类Java.lang.class #3是否意味着语言中定义的类本身属于java.lang

好的,这里有概念上的困难-从一本书中阅读和学习Java

它提到以下内容(在解释几个不同主题的过程中)——

  • Java不支持类层次结构中的多重继承。因此,如果类C是类a的子类,那么它不可能也是类B的子类(我知道接口在这里提供了一个解决方案)

  • java.lang.Object
    是所有类(系统和用户)“扩展”的原始类。因此,每个类都是类
    java.lang.Object

  • Java中的类不仅是编译器人工制品,而且在运行时由类
    Java.lang.class

  • #3是否意味着语言中定义的类本身属于
    java.lang.Class
    ——而#2是否意味着它们也属于
    java.lang.Object
    ——与#1相矛盾?比如java类的子类是哪个类

    如果#1仍然成立,我猜这意味着#3只是说类的“运行时表示”是类
    java.lang.class
    的实例,它是
    java.lang.Object
    的子类,但类本身是
    java.lang.Object
    的子类

    感谢您的指导!!提前谢谢

    #3不意味着语言本身定义的类属于
    java.lang.Class

    否。
    (Class)testclass
    是语法错误-没有类是
    java.lang.Class
    的子类-它是
    final

    扩展了
    对象
    并表示一个

    假设我有
    TestClass
    ,它默认扩展了
    Object
    ,现在
    TestClass.class
    (TestClass).getClass()存在-它们返回
    class
    ,它扩展了
    Object
    ,是
    类的一个实例

    3) Java中的类不仅是编译器工件,而且在运行时,由类Java.lang.class的实例表示

    这是不对的。Java对象是对象。它们还有一个表示类类型的属性

    public class Test  {
       public static final void main(String[] ignored)  {
          String s = "x";
          Class cls = s.getClass();
          System.out.println("s=" + s.toString());
          System.out.println("cls=" + cls.toString());  
       }
    }
    
    输出:

    s=x
    cls=class java.lang.String
    
    我们说“Java对象是类”是令人困惑的。这在一般意义上是正确的,但是在这个特定的技术细节中,它是不准确的

    不严格地说,Java对象存储在
    *.class
    文件中,这是另一个使这种区别混淆的地方

    3) Java中的类不仅是编译器工件,而且在运行时,由类Java.lang.class的实例表示

    这是正确的

    #3不意味着语言本身定义的类属于java.lang.Class类型吗

    这是正确的

    而#2表示它们也是java.lang.Object类型

    这是正确的

    。。。矛盾的#1

    这是不正确的。没有矛盾

    “扩展”关系仅在类之间定义。。。在运行时表示类的
    对象之间。如果您查看
    java.lang.Class
    API,您将看到
    Class getSuperclass()
    isAssignableFrom(Class)
    等方法。。。尽管
    isAssignableFrom
    正在测试“子类型”关系。请注意,这些方法将另一个类作为参数,或返回另一个类

    类和实例之间没有“继承”或“扩展”关系。运行时对象之间也没有这种关系。
    java.lang.Class
    扩展了
    java.lang.Object
    这一事实在这里并不相关


    如果#1仍然成立,我猜这意味着#3只是说类的“运行时表示”是类java.lang.class的实例,它是java.lang.Object的子类

    这是正确的

    。。。。但是类本身是java.lang.Object的子类

    这也是正确的


    然而,需要注意的是,这两个属性并不是直接从对方而来的。类和表示类的运行时类之间存在相似的外观关系,这(有点)巧合。

    您混淆了类和类的实例。类是类
    的实例,
    与所有类一样,是
    对象
    的子类。例如,
    String
    的实例不是
    Class
    的实例,也不是
    Class
    的子类。只是<<代码>字符串类本身是类< /C> >(而不是<代码>字符串的实例)。(真的让你心烦,认为类<代码>类< /代码>本身就是<代码>类< /代码>的一个实例,而且,类<代码>对象< /代码>也是<代码>类< /代码>的实例。(哦,
    Class clazz=Class.Class
    起作用了。现在我真的很困惑。)如果它们存储在
    *.object
    文件中会不会不那么让人困惑?@HotLicks我不明白。这是个玩笑吗?@HotLicks我不明白。你是说我的答案中有什么可以改进的吗?@HotLicks让我成为“对象”的“类”非常低我能说什么呢?我的内心是一个老装配工——根本不用上课。谢谢!我现在明白了——认为类是对象的一个子类型似乎有点奇怪——但一旦我意识到这一点,它就有了意义