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

Stella981
• 阅读 611

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

前言

也许大家在刚开始学Java的时候就听说过,Object类是所有的类的父类。但是有没有思考过,为什么我们自己创建的类,没有继承Object类,但是却能调用Object类的方法呢?

正文

下面直接看一下截图,分别是自定义类ObjectTest跟Object类。

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

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

既然我们没有显式继承Object类,也能调用Object类里的方法,那是什么机制可以达到“自动继承”呢?

1.由于我们的Java是运行在JVM之上的语言,所以有一种可能是,我们的编译器在编译代码的时候,如果该类没有继承任何类,它会自动的帮我们在编译的时候加上默认的父类“Object“,若该类有父类了就不作处理,这样一来我们就可以使用Object里面public跟protected的方法了。

2.还有一种可能是,在编译的时候保持原样,只是在运行的时候去判断有没有显式继承其他类,若没有则默认把Object当成自己父类处理。我们可以直接反编译刚才的class文件来一探究竟。

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

通过“javap”命令可以看到反编译出来的文件,编译器并没有在编译的时候把“extends Object“添加上去,那么可见是第2种方式实现的。

此时如果你在网上查找资料的话会发现,有些人使用jdk6的时候,反编译出来Java源码会存在“extends Object“。所以我们总结下来,不同的jdk版本实现方式是不一样的,笔者当前的使用的版本是"1.8.0_111"。

相关解疑

既然是编译器或者运行期JVM才帮我们做了继承这件事,那为什么我们写代码的时候可以直接用这些方法呢?

答:其实这是IDE帮我们做的处理,默认了类都是继承自Object,才能直接使用里面的方法。

如果我自己在类上“extends Object“可以么?

答:当然可以,JVM会判断当前类是否有继承其他类,才开始做后续的处理,但是如果你这么写的话,就不能继承其他类了,Java不支持多继承。

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

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

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
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
Jacquelyn38 Jacquelyn38
2年前
你不可不知的JS面试题(第二期)
1、什么是继承?子类可以使用父类的所有功能,并且对功能进行扩展。新增方法改用方法(1)、ES6使用extends子类继承父类的方法。// 父类    class A        constructor(name)            this.name name;                getNa
Bill78 Bill78
3年前
Python的新式类和旧式类
概述:Python中支持多继承,也就是一个子类可以继承多个父类/基类。当一个调用一个自身没有定义的属性时,它是按照何种顺序去父类中寻找的呢?尤其是当众多父类中都包含有同名的属性,这就涉及到新式类和经典类的区别。多继承:classFood(object):23def__init__(self,name,col
Wesley13 Wesley13
2年前
Java学习随笔
Object类的toString方法将一个对象返回为字符串形式,但一般使用的时候会覆盖重写toString方法Object类是所有类的父亲//publicclassPerson{privateStringname;privateintage;//
Stella981 Stella981
2年前
Object类
作为万类之首的Object类,我们有必要详细全面的了解一下。Object类定义在Object.java文件,属于包java.lang。Object类有一个私有方法privatestaticnativevoidregisterNatives().native是java语言的一个关键字.使用native关键字说明这个方法是原生函数,也就是这个
Wesley13 Wesley13
2年前
JDK核心JAVA源码解析(1)
想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。首先我们从所有类的父类Object开始:1\.Object类(1)hashCode方法和equals方法
Wesley13 Wesley13
2年前
Java中为什么需要Object类,Object类为什么是所有类的父类
Java中Object是所有类的父类,所有类的对象都是Class类的实例。贴上javadoc中的说明!(https://static.oschina.net/uploads/space/2017/0320/224831_Uobg_1400660.png)为什么我们需要Object类这个问题找到了一个外国哥们的回答,
Wesley13 Wesley13
2年前
Java基础——继承
extends在java中使用extends关键字来表示继承关系。当创建一个类时,总是在继承,如果在类中声明中没有extends关键字,就总是隐式地从java.lang.Object类继承而来的,所以Object是所有类的元类,class子类名称extends父类名称例如:cl
Wesley13 Wesley13
2年前
Java基础学习总结(7)——Object类
一、Object类介绍  Object类在JAVA里面是一个比较特殊的类,JAVA只支持单继承,子类只能从一个父类来继承,如果父类又是从另外一个父类继承过来,那他也只能有一个父类,父类再有父类,那也只能有一个,JAVA为了组织这个类组织得比较方便,它提供了一个最根上的类,相当于所有的类都是从这个类继承,这个类就叫Object。所以
Wesley13 Wesley13
2年前
35岁是技术人的天花板吗?
35岁是技术人的天花板吗?我非常不认同“35岁现象”,人类没有那么脆弱,人类的智力不会说是35岁之后就停止发展,更不是说35岁之后就没有机会了。马云35岁还在教书,任正非35岁还在工厂上班。为什么技术人员到35岁就应该退役了呢?所以35岁根本就不是一个问题,我今年已经37岁了,我发现我才刚刚找到自己的节奏,刚刚上路。