Java源码赏析(一)Object 类
写这个系列的原因,其实网上已经有无数源码分析的文章了,多一篇不多,少一篇不少,但为什么还要写这部分文章呢?
于私,
其一,上班族已经很久没有打过完整的一整段有意义的话,算是锻炼个人的书写、总结能力,
其二,别人的代码永远是别人的,只有亲自做过才知道其中的滋味,
其三,若干年后如果博客园还在,也算是一段美好的回忆。
于公,网上有大部分的文章属于copy,虽然copy没问题,但是看多了会觉得千篇一律,而且少了很多技术细节,我打算写得详细一点,啰嗦一点,如果能让刚刚入门Java的同学有所收获,那就心满意足了。
首先贴上 Object.java 的代码。
package java.lang;
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
/** 通过对象获得一个类的实例对象,通过Class<?>,可以获取这个类的构造方法、方法和属性等。*/
public final native Class<?> getClass();
/** 返回对象的hash code。主要用于switch 字符串, hashMap等散列集。*/
public native int hashCode();
/**
* 对比对象是否相等。最好和hashCode一起重写。
* 1.equals()对比对象值是否相同
* 2.== 对比两个对象引用是否一致,是否为同一个对象
*/
public boolean equals(Object obj) {
return (this == obj);
}
/** 复制一个对象。类要使用该方法,需要实现Cloneable接口。*/
protected native Object clone() throws CloneNotSupportedException;
/** 转化为String时自动调用的方法,主要用于打印到控制台或日志文件,默认为类名@加十六进制的哈希值(基本不可读),最好重写。*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
/** 同步相关代码等之后的Java随谈中详细介绍*/
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {
wait(0);
}
/** 向垃圾回收器“报告”回收该对象,可以通过重写这个方法实现来检测垃圾回收的时机。*/
protected void finalize() throws Throwable { }
}
这里面每一个方法都十分重要,但有几个方法在很多时候都需要重写的我们着重讲解。
一、equals()和hashCode()
不重写equals比较的是对象是否为同一对象。不重写hashCode()会影响Map、Set的操作。
如何重写?
- 在之前的Java版本需要手动重写这两个方法。
- 如果你使用的是Java7以上的版本,可以使用Objects.deepEquals(Object a, Object b)和Objects.hash(Object... values),方便地进行方法重写。
- 如果你依赖了Lombok,可以使用@EqualsAndHashCode。
二、toString()
在Java中,当要连接对象和字符串时,会自动调用对象的toString()方法,默认为 类名@16进制哈希值,最好重写,增加可读性。
Object a = new Object();
String s = a + " ,hello";
同样,如果你依赖了Lombok,可以使用@ToString。
Java源码赏析(一)Object 类的更多相关文章
- java源码解析之Object类
一.Object类概述 Object类是java中类层次的根,是所有类的基类.在编译时会自动导入.Object中的方法如下: 二.方法详解 Object的方法可以分成两类,一类是被关键字fin ...
- Java源码赏析(五)再识 String 类
在 Java源码赏析(三)初识 String 类 中,我们已经大概理解了String的接口,接下来我们描述一下String的常用工具方法. /** * 为了精简的String结构,之前提到的方法省 ...
- Java源码赏析(三)初识 String 类
由于String类比较复杂,现在采用多篇幅来讲述 这一期主要从String使用的关键字,实现的接口,属性以及覆盖的方法入手.省略了大部分的字符串操作,比如split().trim().replace( ...
- Java源码赏析(六)Class<T> 类
目的 Class 类是每一个程序员都必须了解的,也是使用反射机制的基础. 这篇文章将Class 类的公共方法大致介绍了一遍(省略了安全.枚举.断言.注解相关代码). 代码 package java.l ...
- 【Java源码分析】LinkedList类
LinkedList<E> 源码解读 继承AbstractSequentialList<E> 实现List<E>, Deque<E>, Cloneabl ...
- Java 源码赏析 - java.lang - Void
被人鄙视了,于是也来读读源码... package java.lang; /** * The Void class is an uninstantiable placeholder class to ...
- java源码解析之String类(二)
上一节主要介绍了String类的一些构造方法,主要分为四类 无参构造器:String(),创建一个空字符串"",区别于null字符串,""已经初始化,null并 ...
- java源码解析之String类(一)
String是我们接触最多的类,无论是学习中还是工作中,基本每天都会和字符串打交道,从字符串本身的各种拼接.切片.变形,再到和其他基本数据类型的转换,几乎无时无刻都在使用它,今天就让我们揭开Strin ...
- Java源码赏析(四)Java常见注解
元注解 @Target :标识注解的目标,默认为所有 ElementType.TYPE(用于类) ElementType.FIELD(用于域,包括enum) ElementType.METHOD(用于 ...
随机推荐
- 牛客网PAT练兵场-部分A+B
题解:简单循环 题目地址:https://www.nowcoder.com/questionTerminal/fb581ea099a14f5d97c6149cbeee249f /** * *作者:Yc ...
- Java I/O体系从原理到应用(非原创)
基础概念 在介绍I/O原理之前,先重温几个基础概念: 1 操作系统与内核 操作系统:管理计算机硬件与软件资源的系统软件内核:操作系统的核心软件,负责管理系统的进程.内存.设备驱动程序.文件和网络系统等 ...
- 都2020年了,还再问GET和POST的区别?【深度好文】
最近看了一些同学的面经,发现无论什么技术岗位,还是会问到 get 和 post 的区别,而搜索出来的答案并不能让我们装得一手好逼,那就让我们从 HTTP 报文的角度来撸一波,从而搞明白他们的区别. 一 ...
- C++入门记-构造函数和析构函数
前文回顾 本文档环境基于Vscode + GCC + CodeRunner 关于C++的环境搭建请参考下面链接: C++入门记-大纲 由于本人具有C#开发经验,部分相同的知识就不再赘述了.只列一下需要 ...
- Java 的开发效率究竟比 C++ 高在哪里?
有几个原因 大师助手解决你的烦恼1. 语言上,Java是一个比C++更容易parse得多的语言,所以相应的工具链IDE会更容易做,无论多大的Java的项目,就是新手写完都不会有编译错误.但是写 ...
- Java开发环境搭建的准备工作
Java开发环境搭建的准备工作 网络配置(修改hosts) 什么时候需要 比如我们在安装homeBrew的时候会遇到 curl: (7) Failed to connect to raw.github ...
- cookies、sessionStorage和localStorage
浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互.浏览器查看方式: HTML4的本地存储 cookie 一.cookie和sess ...
- 写shader小细节——这个会不断更新
这个是因为自己被自己蠢哭了动笔的,里面大概记录自己所犯的错,和一些小知识. 1.有一个错误我经常犯:内部定义的字段没对应开放到编辑器的字段.这个是由于我有点依赖ide写代码的习惯导致,而shader的 ...
- Just an Old Puzzle(2019多校1007)
Problem Description You are given a 4 × 4 grid, which consists of 15 number cells and an empty cell. ...
- P2414 [NOI2011]阿狸的打字机 AC自动机
题意 给定n个模式串,有m个询问,每次询问第X个模式串在第Y个模中出现了多少次 解题思路 以fail树相反的方向建一棵树T,问题转化为X的子树中有多少个y的终止节点.跑出T的dfs序,X的子树就可以表 ...