我们用过Java的都知道Java中所有类都是Object类的子类,但我们创建类的时候并没有写上extend Object,那这到底是怎样实现继承关系的呢?本篇文章就来探讨下这个疑问。
首先,我们再思考个问题:
Java中类的继承只能是单继承,那为什么所有类都是Object的子类的情况下,所有类还能继承一个类呢?
解答:Object类、Parent类、Child类
Parent类继承Object;
Child类继承Object类;
Child类继承Parent类;
如图所示,Child类并不是继承Object类的同时继承Parent类,而是Child继承Parent类,Parent类再继承自Object类。其实就是“子类的子类也是子类”,所以会说所有类继承自Object,因为所有类都是Object的子类啊!!继承的传递性。
接下来 ,就是如何实现Java中所有类默认继承Object类呢?
当我们没有写extend时,默认会是有extend Object的,但我们看不到啊!这时候可能想到:这是不是我们写的Java文件在被编译器编译成文件的时候加上的呢?或者是不是虚拟机运行二进制代码时加上的呢?这两种可能都会有,实际如何验证呢?如果是编译器编译java文件成class文件时加上的,那我们将class文件反编译会不会就有了extend Object?有,则说明是编译器处理的;没有,则说明是虚拟机处理的。
具体做法:
可以用JDK自带的反编译工具javap,进行反编译class文件。手动编译和反编译也是我们常用的技能,详情请见我的另一篇文章:
怎样编译java文件和反编译class文件