从今天起,正式开启jdk源码的学习,以前虽然也看过,但总是断断续续的没有系统的学习和坚持下来,现在下定决心要把这块骨头啃下来,哈哈。
java.long.Object是所有class的顶级父类,也是我们学习的源头。
首先我们来看一下Object的结构:

前两行就是静态代码块1
2
3
4private 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
3public boolean equals(Object obj) {
return (this == obj);
}
equals()方法用于判断对象是否相等,比较的是两个对象的地址,如果你需要修改比较的方式,那么你需要重写equals方法和hashCode方法。
1 | protected native Object clone() throws CloneNotSupportedException; |
clone()方法用来返回一个对象的复制,和复制引用不同,会重新创建和分配内存空间:1
2
3
4
5
6Object obj = new Object();
Object obj1 = obj.clone();
Object obj2 = obj;
obj1 == obj;//false
obj2 == obj;//true
obj1 == obj2;//false
接下的是toString()方法,这个方法很常用,通常我们在自己的类中会重写这个方法。默认输出的是类名和哈希值。1
2
3public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
notify()方法用于在多线程中唤醒等待的线程,notifyAll()的区别是唤醒所有正在等待当前对象的线程。1
2public 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
22public 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。