Java类是如何默认继承Object的?

原:http://www.javashuo.com/article/p-bxsoqqmr-gw.htmljava

前言

学过Java的人都知道,Object是全部类的父类。可是你有没有这样的疑问,我并无写extends Object,它是怎么默认继承Object的呢?编程

那么今天咱们就来看看像Java这种依赖于虚拟机的编程语言是怎样实现默认继承Object的,以及Java编译器JVM究竟是如何作的?jvm

继承自Object验证

首先咱们来验证一下Object是否是全部类的父类,随便新建一个Java类,以下图:
编程语言

从上面的代码能够看出,new MyClass()打点以后能够选择调用的方法有不少,咱们定义的MyClass类里面只有一个main方法,那这些方法哪来的,显然是Object里声明的,故MyClass类的父类就是Object,所以,在MyClass中可使用Object类的public或protected资源。编辑器

另外,当A类继承MyClass类时,经过打点也能够调到Object内的方法,这是继承的传递,比如Object是MyClass的“父亲”,MyClass是A类的“父亲”,Object是A类的“爷爷”,间接的继承了Object。工具

所以,Object是超类,是全部类的父类。post

推测可能的缘由

要了解Java类是如何默认继承Object的?的缘由其实并不须要知道JVM的实现细节。只需了解一下对于这种虚拟机程序的基本原理便可。通常对于这种靠虚拟机运行的语言(如Java、C#等)会有两种方法处理默认继承问题。ui

编译器处理

在编译源代码时,当一个类没有显式标明继承的父类时,编译器会为其指定一个默认的父类(通常为Object),而交给虚拟机处理这个类时,因为这个类已经有一个默认的父类了,所以,VM仍然会按照常规的方法像处理其余类同样来处理这个类。对于这种状况,从编译后的二进制角度来看,全部的类都会有一个父类(后面能够以此依据来验证)。命令行

JVM处理

编译器仍然按照实际代码进行编译,并不会作额外的处理,即若是一个类没有显式地继承于其余类时,编译后的代码仍然没有父类。而后由虚拟机运行二进制代码时,当遇到没有父类的类时,就会自动将这个类当作是Object类的子类(通常这类语言的默认父类都是Object)。3d

验证结论

从上面两种状况能够看出,第1种状况是在编译器上作的文章,也就是说,当没有父类时,由编译器在编译时自动为其指定一个父类。第2种状况是在虚拟机上作文章,也就是这个默认的父类是由虚拟机来添加的。

那么Java是属于哪种状况呢?其实这个答案很好得出。只须要随便找一个反编译工具,将.class文件进行反编译便可得知编译器是如何编译的。

就以上面代码为例,若是是第1种状况,就算MyClass没有父类,但因为编译器已经为MyClass自动添加了一个Object父类,因此,在反编译后获得的源代码中的MyClass类将会继承Object类的。若是不是这种状况,那么就是第2种状况。

那么实际状况是什么样的呢?如今咱们就将MyClass.class反编译看看到底如何。

jd-gui反编:

使用JDK自带的工具(javap)反编译

CMD命令行下执行:javap MyClass>MyClass.txt

能够看出实际的反编译后的文件中并无extends Object,使用排除法,所以是第2状况。

这样来推导出的结论是第2种状况,但事实真的如此吗?为何网上还有说反编译后的是有extends Object字样?

JDK版本问题?

猜测是JDK版本的问题,因而把JDK版本切换到7,使用jd-gui和javap反编译,接果和使用JDK8反编译后的结果同样,也都没有extends Object

继续换版本,昨晚在宿舍准备到Oracle官网下载JDK 6,可是死活下不来,今早到公司后第一件事就是下载,很顺利,安装后把JDK版本切换到JDK 6。

仍然在CMD窗口执行javap MyClass>MyClass.txt,获得的TXT文件内容以下:

what?居然有extends Object,jd-gui反编译后的依然没有。
即,JDK 6以前使用javap反编译后的MyClass类显式的继承Object,JDK 7之后没有;jd-gui反编译后的无论JDK版本如何始终没有。咱们以java自带的工具为准。

总结

那么就是说JDK 6以前是编译器处理,JDK 7以后是虚拟机处理。

可是仔细想一想咱们在编辑器里(IDE)打点时就能列出Object类下的方法,此时还没轮到编译器和jvm,编辑器就已经知道MyClass类的父类是Object类了,这是由于编辑器为咱们作了一些智能处理。

【end】 注意区分编辑器和编译器

相关文章
相关标签/搜索