jdk源码Object类解析
一 简介
java.lang.Object,是Java所有类的父类,在你编写一个类的时候,若无指定父类(没有显式extends一个父类),会默认的添加Object为该类的父类。
在JDK 6之前是编译器处理,即编译后的zclass字节码可以显示的看到 extends Object.
JDK 7之后是虚拟机处理,class字节码已经看不到了,虚拟机执行代码会默认添加Object类为父类。
我们在编辑器里(IDE)打点时就能列出Object类下的方法,此时还没轮到编译器和jvm,编辑器就已经知道MyClass类的父类是Object类了,这是因为编辑器为我们做了一些智能处理.
二 代码解析
public class Object {
//native修饰的方法都是本地方法,即在C/C++在DLL中已经实现,通过JNI调用
private static native void registerNatives();
//类初始化调用此方法
static {
registerNatives();
}
/**
* Constructs a new object.
*/
@HotSpotIntrinsicCandidate
public Object() {}
/**
* 返回此Object的运行时类(每个类的Class类对象)
* 每一个类在被加载的时候,都会生成一个Class类实例,
* 而这个方法就可以在运行时期获得对象(这里的对象是堆里的那个对象,也就是获得的是动态类型的那个类)的Class对象,Class对象主要用于反射。
*/
@HotSpotIntrinsicCandidate
public final native Class<?> getClass();
/**
* 这个方法返回对象的哈希码值,这个方法与哈希表的性能有关,它的实现方法是通过将对象在内存中所处于的位置转换成数字,这个数字就是hashCode
*/
@HotSpotIntrinsicCandidate
public native int hashCode();
/**
* 对比两对象的内存地址,如果不重写,equals方法比较的是对象地址
* 判断其它对象是否与此对象“相等”;如果一个对象要重写这个方法,需要与其它非空对象满足等价关系:以下的x,y,z均为非空对象
* (1)自反性,x.equals(x)=true;
* (2)对称性,x.equals(y) = y.equals(x);
* (3)传递性,若x.equals(y) = true,y.equals(z) = true,则x.equals(z) = true;
* (4)一致性,只要equals的比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)就会一致地返回相同结果;
* (5)x.equals(null) = false;
* 注意: 当重写equals方法时,也要重写hashCode方法,这是为了确保相等的对象有相同的哈希码值
*/
public boolean equals(Object obj) {
return (this == obj);
}
/**
* protected方法,子类可重写,创建并返回此对象的一个副本。
* 所有的数组都被视为实现接口 Cloneable,且 数组类型T[]的 clone方法返回的类型是T[] ,T 可以是任何引用或基本类型
* 一个类只有实现了Cloneable接口(标记接口,无任何内容,只针对clone方法),才可以在该类的实例上调用clone方法,否则会抛出CloneNotSupportException。
* Object中默认的实现是一个浅拷贝,也就是表面拷贝,如果需要实现深层次拷贝的话,必须对类中可变域生成新的实例
*/
@HotSpotIntrinsicCandidate
protected native Object clone() throws CloneNotSupportedException;
/**
* 返回对象的的字符串表示,默认是:类名+@+此对象哈希码的无符号十六进制表示组成,即值等于:getClass().getName() + '@' + Integer.toHexString(hashCode())
*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
/**
* 唤醒在此对象监视器上等待的线程,如果有多个,随机选择一个
*/
@HotSpotIntrinsicCandidate
public final native void notify();
/**
* 唤醒在此对象监视器上等待的所有线程
*/
@HotSpotIntrinsicCandidate
public final native void notifyAll();
/**
* final修饰,不可重写,永久等待,直到被唤醒
*/
public final void wait() throws InterruptedException {
wait(0L);
}
/**
* 本地已实现方法,在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待
* 在超过给定参数 timeoutMillis 时间之前会一直等待,可提前被唤醒,即等个最大等待时间,如果是0 则永久等待
*/
public final native void wait(long timeoutMillis) throws InterruptedException;
/**
* 与上面方面相同,但是可以精确控制时间到 毫微妙级别
* timeoutMillis - 毫秒
* nanos - 毫微妙
* 1秒=1000豪秒 1毫秒=1000微秒 1微秒=1000毫微秒
*/
public final void wait(long timeoutMillis, int nanos) throws InterruptedException {
if (timeoutMillis < 0) {
throw new IllegalArgumentException("timeoutMillis value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeoutMillis++;
}
wait(timeoutMillis);
}
/**
* finalize()是Object的protected方法,子类可以覆盖该方法以实现资源清理工作,GC在回收对象之前调用该方法,jdk9之后已被废弃
* 一个对象只会调用一次
*/
@Deprecated(since="9")
protected void finalize() throws Throwable {}
}
jdk源码Object类解析的更多相关文章
- 2018-08-27 使用JDT核心库解析JDK源码后初步分析API命名
源自术语词典API项目 · Issue #85 · program-in-chinese/overview, 打算先用早先的代码提取JDK API中的类/方法/参数名, 看看有哪些词需要翻译. 源码在 ...
- JDK源码学习笔记——Object
一.源码解析 public class Object { /** * 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用 */ private static native void ...
- Java中集合框架,Collection接口、Set接口、List接口、Map接口,已经常用的它们的实现类,简单的JDK源码分析底层实现
(一)集合框架: Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(实现接口的类).所有抽象出来的数据结构和操作(算法)统称为集合框架. 程序员在具体应用的时候,不必考虑数据结构和 ...
- 设计模式-简单工厂Coding+jdk源码解析
感谢慕课geely老师的设计模式课程,本套设计模式的所有内容均以课程为参考. 前面的软件设计七大原则,目前只有理论这块,因为最近参与项目重构,暂时没有时间把Coding的代码按照设计思路一点点写出来. ...
- 从JDK源码角度看Object
Java的Object是所有其他类的父类,从继承的层次来看它就是最顶层根,所以它也是唯一一个没有父类的类.它包含了对象常用的一些方法,比如getClass.hashCode.equals.clone. ...
- JDK源码阅读(三):ArraryList源码解析
今天来看一下ArrayList的源码 目录 介绍 继承结构 属性 构造方法 add方法 remove方法 修改方法 获取元素 size()方法 isEmpty方法 clear方法 循环数组 1.介绍 ...
- JDK源码阅读(一):Object源码分析
最近经过某大佬的建议准备阅读一下JDK的源码来提升一下自己 所以开始写JDK源码分析的文章 阅读JDK版本为1.8 目录 Object结构图 构造器 equals 方法 getClass 方法 has ...
- Integer.parseInt不同jdk源码解析
执行以下代码: System.out.println(Integer.parseInt("-123")); System.out.println(Integer.parseInt( ...
- 结合JDK源码看设计模式——原型模式
定义: 指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.不需要知道任何创建的细节,不调用构造函数适用场景: 类初始化的时候消耗较多资源 new产生的对象需要非常繁琐的过程 构造函数比较 ...
随机推荐
- Jmeter线程组使用详解,持续加压线程组详解
以下罗列的是Jmeter 所有线程组的详解,包括官方自带的线程组,和官方插件的线程组.官方线程组安装,详见之前的文章:https://www.cnblogs.com/beimingyouyuqingc ...
- ES6学习----let、const、解构赋值、新增字符串、模板字符串、Symbol类型、Proxy、Set
这篇es6的学习笔记来自于表哥 表严肃,是我遇到过的讲课最通透,英文发音最好听的老师,想一起听课就去这里吧 https://biaoyansu.com/i/hzhj1206 ES6就是JS6,JS的第 ...
- 洛谷$P4884$ 多少个1? 数论
正解:$BSGS$ 解题报告: 传送门$QwQ$ 首先看到这个若干个一,发现不好表示,考虑两遍同时乘九加一,于是变成$10^n\equiv 9\cdot K+1(mod\ m)$ 昂然后不就是$bsg ...
- 关于Mac VMFusion Centos7虚拟机网络的配置
1.环境配置: 创建完快照后启动虚拟机,使用root用户和root密码登录系统 1.1 停止防火墙 #停止防火墙 [root@localhost ~]#systemctl stop firewalld ...
- 电信NBIOT平台的CA证书上传-消息订阅回调地址检测503错误
在NBIOT北向开发过程中,遇到消息订阅回调地址检测503错误,经过论坛查询与文档查阅一直都没有解决问题,大多人都说是RESTful地址格式问题,但其实不是.最终发现是我们在电信平台创建应用时,上传C ...
- 使用EF操作Docker中的Mysql实例
为啥我会选择mysql呢?因为我的服务器配置较低,而SqlServer在docker中的实例,服务器的运行内存应当保持在2G+,我没有这个条件,它会爆出这样的错误 sqlservr: This pro ...
- python3 三行代码基于HTTP2完美实现APNS推送【详解】
第一次做苹果APNS(Apple Push Notification service)推送,关于APNS推送原理以及证书的获取方式网上已经有许多资料,在此不做过多赘述,需要注意的是证书分为测试证书和正 ...
- Could not find a version that satisfies the requirement numpy>=1.7.0 (from pan das==0.17.0) (from versions: ) No matching distribution found for numpy>=1.7.0 (from pandas==0.17.0)
今天晚上一直在安装pandas,天杀的,真的是太难了.后来发现提示: Could not find a version that satisfies the requirement numpy> ...
- fastjson使用详解
目录 二.fastjson使用 三.fastjson 常用 API 四.fastjson使用演示 测试类准备 1.java类转换为json字符串 2.json字符串转为java类 五.fastjson ...
- JPA或Hibernate中使用原生SQL实现分页查询、排序
发生背景:前端展示的数据需要来自A表和D表拼接,A表和D表根据A表的主键进行关联,D表的非主键字段关联C表的主键,根据条件筛选出符合的数据,并且根据A表的主键关联B表的主键(多主键)的条件,过滤A表中 ...