前言
也许大家在刚开始学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不支持多继承。
喜欢的话,麻烦大家点个赞~关注一下微信公众号《深夜里的程序猿》,每天分享最干的干货