本篇章解析Object类
1.private static native void registerNatives();
native关键字:说明这个方法的实现并没有在java中完成,而是在C或者C++中完成的。
static { registerNatives(); }
registerNatives,意思是本地注册,这个方法放在静态块中说明类初始化的时候就会执行这个方法。
2.public final native Class<?> getClass();
getClass方法是final方法(不可被继承的),其用途是返回当前类的Class对象,我们可以通过Class对象来获取这个类中的很多信息(类、接口、数组类、基本类型或 void)。
3.public native int hashCode();
返回object的hashCode,所有的Object都有其自己的hashCode,相同Object的hashCode一定相同,不同Object的hashCode可能相同。
4.equals方法
public boolean equals(Object obj) { return (this == obj); }
5.protected native Object clone() throws CloneNotSupportedException;
如果没有实现Cloneable接口,调用Object的clone方法,会导致抛出CloneNotSupportedException异常。
* x.clone() != x</pre></blockquote> * will be true
其实是克隆了一个实例,但是这两个实例的地址是不同的。(个人理解)
6.public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
toString方法,返回了类名以及hashCode。
7.public final native void notify();
随机地唤醒一个正在等待这个object monitor的线程,并且被唤醒的线程要等待当前获得这个object的lock的线程放弃锁之后才可以执行(proceed),并且notify()这个方法应该是被获取当前object的锁的线程来调用,如果当前线程没有获得这个object 的 monitor,调用notify()方法会抛出IllegalMonitorStateException异常。
8.public final native void notifyAll();
同上,但是会唤醒所有在等待这个object monitor的线程。同样如果当前线程没有获得获得这个object 的 monitor,调用notifyAll()方法会抛出IllegalMonitorStateException异常。
9.public final native void wait(long timeout) throws InterruptedException;
让当前获得这个object monitor的线程放弃他的线程锁,除非1.wait时间结束,2.被notify,3.被notifyAll,4.interrupted
10.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); }
11.public final void wait() throws InterruptedException { wait(0); }
直接调用wait方法不传入数字的话说明直接让线程进入wait直到被唤醒(0默认一直等待下去)。
12.protected void finalize() throws Throwable { }
finalize应该被垃圾收集器所调用,类被GC认为应该被回收时会调用一次该方法。