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

  • 相关阅读:
    一些关于视频相关基础概念
    熟悉某项目代码---零碎小知识总结
    C#中如何判断一个字符是汉字
    面试碰到一个这样的题------ 输入为一个字符串和字节数,输出为按字节截取的字符串
    C# 拼Json格式字符串 返回前段js 出错解决
    学习maple
    格林公式
    麦克斯韦方程组 (Maxwell's equation)的简单解释
    关于Ciarlet的泛函的一道homework的一个想法
    关于分开编写多个LaTeX文件的一点微小的总结
  • 原文地址:https://www.cnblogs.com/nicknailo/p/8808104.html
Copyright © 2020-2023  润新知