美文网首页
Java中的类是如何默认继承Object的?

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

作者: ip小怪兽 | 来源:发表于2019-12-04 17:41 被阅读0次

前言

学过 Java的人都知道, Object是所有类的父类。但是你有没有这样的疑问,我并没有写 extends Object,它是怎么默认继承Object的呢?那么今天我们就来看看像 Java这种依赖于虚拟机的编程语言是怎样实现默认继承 Object的,以及 Java编译器和JVM到底是如何做的?


继承自Object验证

首先我们来验证一下 Object是不是所有类的父类,随便新建一个Java类,如下图:

从上面的代码可以看出, new MyClass()打点之后可以选择调用的方法有很多,我们定义的 MyClass类里面只有一个 main方法,那这些方法哪来的,显然是 Object里声明的,故 MyClass类的父类就是 Object,因此,在 MyClass中可以使用 Object类的 publicprotected资源。

另外,当 A类继承 MyClass类时,通过打点也可以调到 Object内的方法,这是继承的传递,好比 ObjectMyClass的“父亲”, MyClass是A类的“父亲”, Object是A类的“爷爷”,间接的继承了 Object。因此, Object是超类,是所有类的父类。


推测原因

  • 编译器处理

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

  • JVM处理

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


验证结论

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

那么 Java是属于哪一种情况呢?

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

可以看出实际的反编译后的文件中并没有 extends Object,使用排除法,因此是 第2种情况。

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

JDK版本问题?
猜想是 JDK版本的问题,于是把 JDK版本切换到7,使用 jd-gui和 javap反编译,接果和使用 JDK8反编译后的结果一样,也都没有 extendsObject。继续换版本,把 JDK版本切换到 JDK 6。


竟然有 extends Object。即, JDK 6之前使用 javap反编译后的 MyClass类显式的继承 Object, JDK 7以后没有。

小结

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

但是仔细想想我们在编辑器里(IDEA)打点时就能列出 Object类下的方法,此时还没轮到编译器和JVM,编辑器就已经知道MyClass类的父类是Object类了,这是因为编辑器为我们做了一些智能处理。

相关文章

  • 06 Java常用类

    java.lang.Object类 所有Java类的最终祖先,编译系统默认继承Object类,Object类包含了...

  • 深入Java基础(一)--Object类分析

    Object类是java中所有类的父类,所有类默认(而非显式)继承Object。这也就意味着,Object类中的所...

  • Java常用类

    1. Object类 java.lang.object类是所有类的父类,默认继承Obecjt类。Object类常用...

  • Java自学-接口与继承 Object类

    Java中的超类 Object 步骤 1 : Object类是所有类的父类 声明一个类的时候,默认是继承了Obje...

  • Object类和包装类

    Object类 什么是Object类 Object类是java中所有类的父类我们编写的类如果不继承任何类,那么默认...

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

    前言 学过 Java的人都知道, Object是所有类的父类。但是你有没有这样的疑问,我并没有写 extends ...

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

    前言 学过Java的人都知道,Object是所有类的父类。但是你有没有这样的疑问,我并没有写extends Obj...

  • Object类

    概念:java默认提供的一个类,java除了object,其他类都可以又继承,都继承object 本质操作: ob...

  • Java Collection

    1.对于所有类的间接父类或者直接父类都是Object的理解默认继承Object类 java.lang.Object...

  • jdk源码分析(一)——Object类

    一.概述 Object类是java中所有类的父类,所有类默认(而非显式)继承Object。这也就意味着,Objec...

网友评论

      本文标题:Java中的类是如何默认继承Object的?

      本文链接:https://www.haomeiwen.com/subject/buvlgctx.html