jdk源码学习(一):万物皆对象,解密java中所有对象的父类Object

  Seves

在java世界里,万物皆对象。所以Object类是所有类的根,那么我们一起来看看java语言的设计者是如何设计这个伟大的父类的。

1. registerNatives()方法

    private static native void registerNatives();
    static {
        registerNatives();
    }

此方法的作用大概就是将java的native方法注册上去,使得java程序需要调用本地方法时,虚拟机在加载动态文件中定位并链接改本地方法从而得以执行本地方法。
关于此方法的解释可以参考此文章:https://blog.csdn.net/Saintyyu/article/details/90452826

2. getClass()方法, 返回对象运行时类

public class MyObject {
    public static void main(String[] args) {
        MyObject thisObj = new MyObject();
        // 运行时的类是: class oct2019.jdkLearn.MyObject
        System.out.println(thisObj.getClass());
    }
}

3, hashCode(),返回对象的哈希值

// 对象的哈希值:1163157884
System.out.println(thisObj.hashCode());

此方法返回对象的哈希值,为hashMap这样的散列表提供支持。关于hashCode有三条基本原则:
- 对于一个java程序的一次执行中,同一个对象无论调用多少次hashCode方法返回的值应该是同一个整数,如果equals方法没有被修改的前提下。在一个java程序的多次执行中一个类的hashCode不需要想等。
- 如果两个对象调用equals方法比较是想等的,那么调用两个对象的hashCode方法必须返回相同的整数值。
- 如果两个对象根据equals方法比较是不等的,那么嗲用hashCode方法不一定返回不同的整数值。

hashCode方法最理想的效果就是每个不同的类能有不同的值,hashCode方法是一个native方法。无需java实现。

4. equals(Object obj),返回其它对象是否和此对象相等

String x = "java";
String y = "java";
String z = "java";
System.out.println(x.equals(x)); // true
System.out.println(x.equals(y)); // true
System.out.println(y.equals(x)); // true
System.out.println(y.equals(z)); // true
System.out.println(x.equals(z)); // true
System.out.println(x.equals(null)); // false

Object对此方法的实现是当且进度x和y引用相同的对象(x == y)时返回true。(x和y是非空对象的引用),equals方法在非空对象上实现了如下关系:(以下x,y,z都是非空对象引用)
- 自反性: x.equals(x)应该返回true.
- 对称性:如果y.equals(x)返回true, 则x.equals(y)也返回true.
- 传递性:如果x.equals(y)返回true,y.equals(z)返回true, 则x.equals(z)返回true.
- 一致性:在equals方法没有被修改过的前提下,多次调用结果一致.
- x.equals(null)必然返回false.

请注意 无论何时覆盖equals方法时,通常需要同时覆盖hashCode方法,以便维护hashCode方法的三条基本原则。

5. clone(),创建并返回此对象副本

一般来说,x.clone() != x, 而且x.clone().getClass() == x.getClass()将返回true,但这个不是绝对的。x.clone().equals(x)也不是绝对的,因为这个得看改对象是怎么实现equals方法的。拷贝有深拷贝和浅拷贝,具体可以参考这篇博客:https://cloud.tencent.com/developer/article/1384236

6. toString(),返回对象的字符串表达形式

public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

很明显,Object类对toString方法的实现是很简单的类名+@+十六进制哈希值。一般来说建议子类覆盖此方法返回一个简明并易读的字符串来表示此对象(a concise but informative representation).

7. finalize(),垃圾回收之前调用

此方法一般不会用到,也尽量避免用到。

8. wait()和notify()的理解与使用

https://blog.csdn.net/qq_41140741/article/details/81488663
另外: wait()与notify()获取对象监视器(锁)的三种方式
http://www.voidcn.com/article/p-cvjskshu-te.html

作者 [@没有故事的老大爷][1]
[1]: https://www.chenchen.zone/

28