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修改。

原文地址:https://www.cnblogs.com/nicknailo/p/8808104.html