jdk之object源码理解
Java所有类都继承与Object,本文谈谈我对object源码的理解,如果有错的,请看官多多批评指正。
1、registerNatives()
private static native void registerNatives(); static { registerNatives(); }
注册本地方法,静态块内运行,将object内native方法都加载上,native修饰表示这个方法涉及JNI,注册本地方法,用C++写的程序。
2、getClass()
//@return The {@code Class} object that represents the runtime
class of this object.
public final native Class<?> getClass();
native方法,调用此方法,返回运行时类名
3、hashCode
/
*<li>Whenever it is invoked on the same object more than once during
* an execution of a Java application, the {@code hashCode} method
* must consistently return the same integer, provided no information
* used in {@code equals} comparisons on the object is modified.
* This integer need not remain consistent from one execution of an
* application to another execution of the same application.
* <li>If two objects are equal according to the {@code equals(Object)}
* method, then calling the {@code hashCode} method on each of
* the two objects must produce the same integer result.
* <li>It is <em>not</em> required that if two objects are unequal
* according to the {@link java.lang.Object#equals(java.lang.Object)}
* method, then calling the {@code hashCode} method on each of the
* two objects must produce distinct integer results. However, the
* programmer should be aware that producing distinct integer results
* for unequal objects may improve the performance of hash tables.
* @return a hash code value for this object. * @see java.lang.Object#equals(java.lang.Object) * @see java.lang.System#identityHashCode */ public native int hashCode();
native方法,返回对象的hashCode码。hashCode返回的并不一定是对象的内存地址,具体取决于运行时库和JVM中方法具体C++实现。
- 如果两个对象object.equal()相等,那么他们的hashCode一定相等。
- 如果两个对象通过object.equal()比较,结果不相等,这两个对象分别调用hashCode可以返回两个不相同的整数。
- 如果对象没有重写equals(),或者重写equals中比较的属性没有被改变,则调用多次hashCode(),其返回值一定是同一个数值,不会变。
4、equals()
public boolean equals(Object obj) { return (this == obj); }
从上面看出来,Object的equals()比较的是对象的地址
5、clone()
/ * @return a clone of this instance. * @throws CloneNotSupportedException if the object's class does not * support the {@code Cloneable} interface. Subclasses * that override the {@code clone} method can also * throw this exception to indicate that an instance cannot * be cloned. * @see java.lang.Cloneable */ protected native Object clone() throws CloneNotSupportedException;
native()方法,表示对对象的深复制。
如: Object A = new Object(); Object B = A;表示浅复制A,此处产生了一个对象A;
Object C = new Object(); Object D = C.clone() 或者 Object D = new Object;表示深复制C,此处产生了两个对象C和D;
6、toString()
/ * @return a string representation of the object.*/ public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
返回类名+16进制的hashCode
7、notify()、notifyAll()、多用于同步代码块、同步方法中。用于唤醒wait()的线程。
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws InterruptedException;
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 void wait() throws InterruptedException {
wait(0);
}
wait()线程需要先抛出中断异常,wait(long timeout, int nanos)timout毫秒单位,nanos纳秒,但是在JVM中只判断有值时,timeout加一毫秒,有点搞笑!
wait(0)表示一直wait(),直至被notify。
8、finalize()
protected void finalize() throws Throwable { }
垃圾回收器在认为该对象是垃圾对象的时候会调用该方法。子类可以通过重写该方法来达到资源释放的目的。 在方法调用过程中出现的异常会被忽略且方法调用会被终止。
任何对象的该方法只会被调用一次
总结,Object类中,equal()、toString()、finalize()可以被重写,equal()重写时一般都会对hashCode修改。