[Java]先有Class还是先有Object?

Posted 纪华裕

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java]先有Class还是先有Object?相关的知识,希望对你有一定的参考价值。

先有鸡还是先有蛋

这个问题让我想到了一个古老的问题,先有鸡还是先有蛋。

回到本题

下面让我们详细看一下这个问题:

在Java的对象模型中:
所有的类都是Class类的实例,Object是类,那么Object也是Class类的一个实例。
所有的类都最终继承自Object类,Class是类,那么Class也继承自Object。


答案是:java.lang.Class是java.lang.Object的派生类,前者继承自后者。

为什么?

这些相互依赖的核心类型完全可以在“混沌”中一口气都初始化好,然后对象系统的状态才叫做完成了“bootstrap”,后面就可以按照Java对象系统的一般规则去运行。

在“混沌”(boostrap过程)里,JVM可以为对象系统中最重要的一些核心类型先分配好内存空间,让它们进入[已分配空间]但[尚未完全初始化]状态。此时这些对象虽然已经分配了空间,但因为状态还不完整所以尚不可使用。然后,通过这些分配好的空间把这些核心类型之间的引用关系串好。到此为止所有动作都由JVM完成,尚未执行任何Java字节码。然后这些核心类型就进入了[完全初始化]状态,对象系统就可以开始自我运行下去,也就是可以开始执行Java字节码来进一步完成Java系统的初始化了。

还是不懂?

简而言之,在一片混乱之中,如盘古开天辟地一般一些相互依赖的类同时出现了。此时JVM是静止的,不执行代码的。

参考链接

以上是关于[Java]先有Class还是先有Object?的主要内容,如果未能解决你的问题,请参考以下文章

1.4 面向对象的基本概念

JS 究竟是先有鸡还是有蛋,Object与Function究竟谁出现的更早,Function算不算Function的实例等问题杂谈

谁在 OS 中调度调度程序——这不是先有鸡还是先有蛋的场景吗?

用 C# 编写 C# 编译器,先有鸡还是先有蛋?

GWT RPC 序列化和循环引用——先有鸡还是先有蛋的问题

浅谈元类(个人理解)