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

前言

也许大家在刚开始学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不支持多继承。

                                                          

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

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

你不可不知的JS面试题(第二期)

1、什么是继承?子类可以使用父类的所有功能,并且对功能进行扩展。新增方法改用方法(1)、ES6使用extends子类继承父类的方法。// 父类    class A        constructor(name)            this.name name;                getNa

Python的新式类和旧式类

概述:Python中支持多继承,也就是一个子类可以继承多个父类/基类。当一个调用一个自身没有定义的属性时,它是按照何种顺序去父类中寻找的呢?尤其是当众多父类中都包含有同名的属性,这就涉及到新式类和经典类的区别。多继承:classFood(object):23def__init__(self,name,col

Java学习随笔

Object类的toString方法将一个对象返回为字符串形式,但一般使用的时候会覆盖重写toString方法Object类是所有类的父亲//publicclassPerson{privateStringname;privateintage;//

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