Object源码解析


从今天起,正式开启jdk源码的学习,以前虽然也看过,但总是断断续续的没有系统的学习和坚持下来,现在下定决心要把这块骨头啃下来,哈哈。

java.long.Object是所有class的顶级父类,也是我们学习的源头。

首先我们来看一下Object的结构:

object

前两行就是静态代码块

1
2
3
4
private static native void registerNatives();
static {
registerNatives();
}

在加载类的时候会运行registerNatives(),将c/c++的代码加载到Java中的native方法,我们不需要太多关注。

1
public final native Class<?> getClass();

本地方法getClass()的作用是得到当前类运行时的类型。不能重写。

1
public native int hashCode();

hashCode()返回对象对应的哈希值,对于同一个对象调用时会返回相同的哈希值。

1
2
3
public boolean equals(Object obj) {
return (this == obj);
}

equals()方法用于判断对象是否相等,比较的是两个对象的地址,如果你需要修改比较的方式,那么你需要重写equals方法和hashCode方法。

1
protected native Object clone() throws CloneNotSupportedException;

clone()方法用来返回一个对象的复制,和复制引用不同,会重新创建和分配内存空间:

1
2
3
4
5
6
Object obj = new Object();
Object obj1 = obj.clone();
Object obj2 = obj;
obj1 == obj;//false
obj2 == obj;//true
obj1 == obj2;//false

接下的是toString()方法,这个方法很常用,通常我们在自己的类中会重写这个方法。默认输出的是类名和哈希值。

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

notify()方法用于在多线程中唤醒等待的线程,notifyAll()的区别是唤醒所有正在等待当前对象的线程。

1
2
public final native void notify();
public final native void notifyAll();

wait()方法用来暂时挂起当前线程,加入等待队列。这里要注意的是当timeout==0时,并不是等待0秒,而是一直等待,直到被唤醒。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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 native void wait(long timeout) throws InterruptedException;

public final void wait() throws InterruptedException {
wait(0);
}

最后一项是finalize()方法,这是一个回调函数,当gc即将回收当前对象时会调用这个方法,但这个时候并不会回收内存,在下一次回收时才会真正的释放内存空间。

1
protected void finalize() throws Throwable { }

下一节咱们学习String

-------------本文结束,感谢您的阅读-------------

本文标题:Object源码解析

文章作者:饭饭君~

发布时间:2018年12月03日 - 16:54

最后更新:2019年04月23日 - 10:50

原始链接:https://yangcf.github.io/2018/12/03/Object源码解析/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

如果我的文章有帮助到你,欢迎打赏~~
0%