写这个系列的原因,其实网上已经有无数源码分析的文章了,多一篇不多,少一篇不少,但为什么还要写这部分文章呢?
于私,
其一,上班族已经很久没有打过完整的一整段有意义的话,算是锻炼个人的书写、总结能力,
其二,别人的代码永远是别人的,只有亲自做过才知道其中的滋味,
其三,若干年后如果博客园还在,也算是一段美好的回忆。
于公,网上有大部分的文章属于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的操作。

如何重写?

  1. 在之前的Java版本需要手动重写这两个方法。
  2. 如果你使用的是Java7以上的版本,可以使用Objects.deepEquals(Object a, Object b)和Objects.hash(Object... values),方便地进行方法重写。
  3. 如果你依赖了Lombok,可以使用@EqualsAndHashCode。

  

二、toString()

在Java中,当要连接对象和字符串时,会自动调用对象的toString()方法,默认为 类名@16进制哈希值,最好重写,增加可读性。

Object a = new Object();
String s = a + " ,hello";

同样,如果你依赖了Lombok,可以使用@ToString。

Java源码赏析(一)Object 类的更多相关文章

  1. java源码解析之Object类

    一.Object类概述   Object类是java中类层次的根,是所有类的基类.在编译时会自动导入.Object中的方法如下: 二.方法详解   Object的方法可以分成两类,一类是被关键字fin ...

  2. Java源码赏析(五)再识 String 类

    在 Java源码赏析(三)初识 String 类   中,我们已经大概理解了String的接口,接下来我们描述一下String的常用工具方法. /** * 为了精简的String结构,之前提到的方法省 ...

  3. Java源码赏析(三)初识 String 类

    由于String类比较复杂,现在采用多篇幅来讲述 这一期主要从String使用的关键字,实现的接口,属性以及覆盖的方法入手.省略了大部分的字符串操作,比如split().trim().replace( ...

  4. Java源码赏析(六)Class<T> 类

    目的 Class 类是每一个程序员都必须了解的,也是使用反射机制的基础. 这篇文章将Class 类的公共方法大致介绍了一遍(省略了安全.枚举.断言.注解相关代码). 代码 package java.l ...

  5. 【Java源码分析】LinkedList类

    LinkedList<E> 源码解读 继承AbstractSequentialList<E> 实现List<E>, Deque<E>, Cloneabl ...

  6. Java 源码赏析 - java.lang - Void

    被人鄙视了,于是也来读读源码... package java.lang; /** * The Void class is an uninstantiable placeholder class to ...

  7. java源码解析之String类(二)

    上一节主要介绍了String类的一些构造方法,主要分为四类 无参构造器:String(),创建一个空字符串"",区别于null字符串,""已经初始化,null并 ...

  8. java源码解析之String类(一)

    String是我们接触最多的类,无论是学习中还是工作中,基本每天都会和字符串打交道,从字符串本身的各种拼接.切片.变形,再到和其他基本数据类型的转换,几乎无时无刻都在使用它,今天就让我们揭开Strin ...

  9. Java源码赏析(四)Java常见注解

    元注解 @Target :标识注解的目标,默认为所有 ElementType.TYPE(用于类) ElementType.FIELD(用于域,包括enum) ElementType.METHOD(用于 ...

随机推荐

  1. 安国AU6989主控 + K9GBG08U0A(NAND) 制作4GB闪存驱动器

    文档标识符:AU6989_FLASH-DRIVE_D-P8 作者:DLHC 最后修改日期:2020.8.22 本文链接: https://www.cnblogs.com/DLHC-TECH/p/AU6 ...

  2. Java中枚举的常见用法

    在JDK1.5以后引入了一种新的类型,就是枚举(enum).enum是用来声明枚举类型数据,它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外, 其他类型的如字母.特殊符号.汉 ...

  3. C# 根据出生年月 计算天数/计算X岁X月X天字符串

    public class TimeTool { //根据出生年月计算 整数天 private static int GetAgeByBirthdate(DateTime birthdate) { Da ...

  4. 全局api 2020/8/14

    // 注意:每次调用 $.get() 或 $.post() 或 $.ajax() 的时候, // 会先调用 ajaxPrefilter 这个函数 // 在这个函数中,可以拿到我们给Ajax提供的配置对 ...

  5. google protocol buffer——protobuf的编码原理二

    这一系列文章主要是对protocol buffer这种编码格式的使用方式.特点.使用技巧进行说明,并在原生protobuf的基础上进行扩展和优化,使得它能更好地为我们服务. 在上一篇文章中,我们主要通 ...

  6. 23种设计模式(C++)

    每一种都有对应理解的相关代码示例 → Git原码 一. GOF-23 模式分类 从目的来看 • 创建型(Creational)模式:将对象的部分创建工作延迟到子类或者其他对象,从而应对需求变化为对象创 ...

  7. 关于windou环境下使用http或者ftp搭建网络hu共享

    第一步 右键此电脑进入控制面 第二步:进入程序点击启用或关闭windous功能 第三步进入服务开启界面 点击让windows更新为你下载文件,并保存更改完,然后关闭 四:邮件我的电脑进入管理 四右键添 ...

  8. go语言之抛出异常

    一: panic和recover 作用:panic 用来主动抛出错误: recover 用来捕获 panic 抛出的错误. 概述: ,引发panic有两种情况 )程序主动调用panic函数 )程序产生 ...

  9. Rider 2018 激活码

    http://jetbrains.license.laucyun.com (Lower of 2017.3) http://13.112.247.119:8000 (All version, espe ...

  10. Shader 语义

    在书写HLSL shader程序时,输入和输出变量需要拥有他们 含义来表明语义.这在HLSL shader中是一个标准的做法. Vertex shader 输入语义 主顶点着色器函数(被指令 #pra ...