JDK-Object源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package java.lang;

public class Object {

/* 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用。*/
private static native void registerNatives();

/* 对象初始化时自动调用此方法*/
static {
registerNatives();
}

/* 返回此 Object 的运行时类。*/
public final native Class<?> getClass();

/*
hashCode 的常规协定是:
1.在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
2.如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。
3.如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
*/

public native int hashCode();



equals

判断两个对象是不是相等。该方法遵循如下性质:

  • 自反性:对于任意非空引用x,则x.equals(x)返回true。
  • 对称性:对于任意非空引用x、y,若x.equals(y)返回true,则y.equals(x)返回true。
  • 传递性:对于任意非空引用x、y、z,若x.equals(y)返回true且y.equals(z)返回true,则x.equals(z)返回true。
  • 对于任何非空引用值x和y,多次调用x.equals(y)始终返回true或者始终返回false,没有提供任何信息进行相等比较的对象被修改。
  • 对于任意非空引用x,则x.equals(null)返回false。

重写equals方法必须重写hashCode方法来保证对任意两个对象equals返回值true时,他们的hashCode返回值必须相等。
请注意源码中的实现是“==”号,必要时请重写该方法!

1
2
3
4
5

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

clone

x.clone() != x 是true
一个对象可以被克隆的前提是该对象代表的类实现了Cloneable接口,否者会抛出一个CloneNotSupportedException异常。

调用clone方法时,分配的内存和源对象(即调用clone方法的对象)相同,然后再使用原对象中对应的各个域,填充新对象的域, 填充完成之后,clone方法返回,一个新的相同的对象被创建,同样可以把这个新对象的引用发布到外部。

克隆是浅复制。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
    /*本地CLONE方法,用于对象的复制。*/
protected native Object clone()throws CloneNotSupportedException;

/*返回该对象的字符串表示。非常重要的方法*/
public String toString(){
return getClass().getName()+"@"+Integer.toHexString(hashCode());
}

/*唤醒在此对象监视器上等待的单个线程。*/
public final native void notify();

/*唤醒在此对象监视器上等待的所有线程。*/
public final native void notifyAll();


/*在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。换句话说,此方法的行为就好像它仅执行 wait(0) 调用一样。
当前线程必须拥有此对象监视器。该线程发布对此监视器的所有权并等待,直到其他线程通过调用 notify 方法,或 notifyAll 方法通知在此对象的监视器上等待的线程醒来。然后该线程将等到重新获得对监视器的所有权后才能继续执行。*/
public final void wait()throws InterruptedException{
wait(0);
}



/*在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量前,导致当前线程等待。*/
public final native void wait(long timeout)throws InterruptedException;

/* 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。*/
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>=500000||(nanos!=0&&timeout==0)){
timeout++;
}

wait(timeout);
}

/*当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
子类一般会重写该方法做一些系统资源清理工作。一个对象只会被调用一次finalize方法。如果finalize方法抛出异常,这个对象的终结将会停止。
*/
protected void finalize()throws Throwable{}
}

本文地址: https://github.com/maxzhao-it/blog/post/60440/