Object类是如何成为所有类的“父亲”?

in 编程
关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9

 

前言

也许大家在刚开始学Java的时候就听说过,Object类是所有的类的父类。但是有没有思考过,为什么我们自己创建的类,没有继承Object类,但是却能调用Object类的方法呢?

 

正文

下面直接看一下截图,分别是自定义类ObjectTest跟Object类。

 

既然我们没有显式继承Object类,也能调用Object类里的方法,那是什么机制可以达到“自动继承”呢?

1.由于我们的Java是运行在JVM之上的语言,所以有一种可能是,我们的编译器在编译代码的时候,如果该类没有继承任何类,它会自动的帮我们在编译的时候加上默认的父类“Object“,若该类有父类了就不作处理,这样一来我们就可以使用Object里面public跟protected的方法了。

2.还有一种可能是,在编译的时候保持原样,只是在运行的时候去判断有没有显式继承其他类,若没有则默认把Object当成自己父类处理。我们可以直接反编译刚才的class文件来一探究竟。

 

 

通过“javap”命令可以看到反编译出来的文件,编译器并没有在编译的时候把“extends Object“添加上去,那么可见是第2种方式实现的。

此时如果你在网上查找资料的话会发现,有些人使用jdk6的时候,反编译出来Java源码会存在“extends Object“。所以我们总结下来,不同的jdk版本实现方式是不一样的,笔者当前的使用的版本是"1.8.0_111"。

 

相关解疑

既然是编译器或者运行期JVM才帮我们做了继承这件事,那为什么我们写代码的时候可以直接用这些方法呢?

答:其实这是IDE帮我们做的处理,默认了类都是继承自Object,才能直接使用里面的方法。

 

如果我自己在类上“extends Object“可以么?

答:当然可以,JVM会判断当前类是否有继承其他类,才开始做后续的处理,但是如果你这么写的话,就不能继承其他类了,Java不支持多继承。

                                                          

喜欢的话,麻烦大家点个赞~关注一下微信公众号《深夜里的程序猿》,每天分享最干的干货

关注公众号【好便宜】( ID:haopianyi222 ),领红包啦~
阿里云,国内最大的云服务商,注册就送数千元优惠券:https://t.cn/AiQe5A0g
腾讯云,良心云,价格优惠: https://t.cn/AieHwwKl
搬瓦工,CN2 GIA 优质线路,搭梯子、海外建站推荐: https://t.cn/AieHwfX9
扫一扫关注公众号添加购物返利助手,领红包
Comments are closed.

推荐使用阿里云服务器

超多优惠券

服务器最低一折,一年不到100!

朕已阅去看看