才疏学浅,博君一笑,文字观点难免有批错疏漏之处,多多包涵。尽信书不如无书,望斟取。我会尽最大努力为自己的文字负责,如有指教,欢迎沟通。主为己记录学习,若汝看过有思,吾倍感足也。
1. 都是对象,我的呢?
JAVA中一切皆对象,所以也可以说一切皆有类。
Class 和 Object 也是两个类,不过他们有点特殊,都是由JVM自带的,出生显贵,可谓 JVM 左膀右臂。那么接下来就简单介绍一下,他们两位的传奇身世,他们之间的爱恨情仇。以及和我们之间又有什么瓜葛呢?
2. 家族背景
Object 是所有类和接口的父类,不需要显式地 extends(不管你承不承认,我都是爸爸 )。
Class 类,在其他所有类载入 JVM 时候都会创建一个与之对应的 Class 类型的对象(保存类的相关信息),自动由 JVM 创建(想自己创建,不好意思,不可以 )。
3. 江湖恩怨
JVM 大背景下,Class 和 Object 双子星皆为一人之下,万人之上,谁都当仁不让。二者之间的千丝万缕,又该如何理清呢?
3.1 一码归一码
- 既然 Object 是所有类的父类,那么他也是 Class 类的父类(这是没有问题地 )。
- 如此,在 JVM 创建装载 Class 类型的对象时,理论上需要先初始化其父类 Object 的构造,然后再初始化自己(这也是没有问题地 )。
- 但是,别忘了 Class 的身份:一切类在装载入 JVM 时都会创建一个与之对应的 Class 类对象,Object 类也不例外,于是问题产生了。
3.2 你行你先
在 JVM 装载 Object 类时需要创建一个 Class 类型对象与之对应,但在创建一个 Class 对象时又需要先初始化其父类 Object。理论上看着,二者在装载初始化自己的过程中,彼此需要对方先初始化好(谁先可用)。如此,陷入了类似鸡和蛋谁先存在的问题?(鸡需要先有蛋才能被孵出来,蛋需要先有鸡才能被生出来)。
问题不解决,那这个世界上就不仅仅没有 JAVA,那么鸡和蛋也会因为谦虚推脱谁先谁后的问题鸽了地球人的餐桌,还有各种类似的问题,例如先有男人还是先有女人等等层出不穷的问题都会令我佛头大,最后一切归于空空如也~
3.3 有谱么?
所幸,混沌开元,万物初始,并没有被如此等等根本问题所桎梏。创世纪之初,问题被解决了(虽然我目前没有答案,你有么?进化论?)。不管怎样,解决了,于是有了太阳万物,有了你我,有了文字字符,有了 0 和 1 (看到这二位,是不是有种真混沌的赶脚~)。
4. 大结局
看到 JVM 加载字节码跑出的 【HELLO WORLD !】 表明以上问题和担忧已经不在了。
深入底层,探寻本质,才是学习所以然的最好方式,所以在 JVM 中有了这样的答案:
在程序启动,JVM 初始过程中,有一个 BootStarp 阶段,该阶段类比混沌开元,一切并没有轮廓分明,包括 Class 和 Object 的关系。在 JVM 内存中给他们配有“特区”,让他们同时进行初始化(并不是我等你先,你等我先式的),当他们都完成可用后,之后程序的运行,一切就按照既定的规定往下运行了。
5. 错过彩蛋,就错过了全部
以上都是为了抛砖引玉哈,以下这两位大牛的博文才是重点。(黔家仔,仔呀,为了引导你来学习,我可是用心了呢,好好和盆友们一起好好读读下面两篇文章吧,也不费我用心良苦了吼)
如果文章中一个点或者一句话对您有一点点帮助或者启发,请小伙伴们不要犹豫一键三连(点赞,评论,关注)哦,那是对黔家仔我最大的鼓励哈,博文有什么问题或错误,欢迎留言评论沟通吼。谢谢您嘞。
世界这么大,我只是一个永远需要不断学习和思考的小学生,感谢所有的挫折和困难。