zoukankan      html  css  js  c++  java
  • Object源码解析(JDK1.8)

      1 package java.lang;
      2 
      3 
      4 public class Object {
      5 
      6     /**
      7      * 一个本地方法,具体是用C(C++)在DLL中实现的,然后通过JNI调用
      8      */
      9     private static native void registerNatives();
     10 
     11     /**
     12      * 对象初始化时自动调用此方法
     13      */
     14     static {
     15         registerNatives();
     16     }
     17 
     18     /**
     19      * 返回此Object的运行时类
     20      */
     21     public final native Class<?> getClass();
     22 
     23     /**
     24      * hashCode的常规协定是:
     25      * 1.在java应用程序执行期间,在对同一对象多次调用hashCode()方法时,必须一致地返回相同的整数,前提是将对象进行equals比较时所用的信息没有被修改。
     26      * 从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。
     27      * 2.如果根据equals(object)方法,两个对象是相等的,那么对这两个对象中的每个对象调用hashCode方法都必须生成相同的整数结果。
     28      * 3.如果根据equals(java.lang.Object)方法,两个对象不相等,那么对这两个对象中的任一对象上调用hashCode()方法不要求一定生成不同的整数结果。
     29      * 但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
     30      */
     31     public native int hashCode();
     32 
     33     /**
     34      * 这里比较的是对象的内存地址
     35      */
     36     public boolean equals(Object obj) {
     37         return (this == obj);
     38     }
     39 
     40     /**
     41      * 本地clone方法,用于对象的复制
     42      */
     43     protected native Object clone() throws CloneNotSupportedException;
     44 
     45     /**
     46      * 返回该对象的字符串表示,非常重要的方法
     47      * getClass().getName();获取字节码文件的对应全路径名例如java.lang.Object
     48      * Integer.toHexString(hashCode());将哈希值转成16进制数格式的字符串。
     49      */
     50     public String toString() {
     51         return getClass().getName() + "@" + Integer.toHexString(hashCode());
     52     }
     53 
     54     /**
     55      * 不能被重写,用于唤醒一个在因等待该对象(调用了wait方法)被处于等待状态(waiting 或 time_wait)的线程,该方法只能同步方法或同步块中调用
     56      */
     57     public final native void notify();
     58 
     59     /**
     60      * 不能被重写,用于唤醒所有在因等待该对象(调用wait方法)被处于等待状态(waiting或time_waiting)的线程,该方法只能同步方法或同步块中调用
     61      */
     62     public final native void notifyAll();
     63 
     64     /**
     65      * 不能被重写,用于在线程调用中,导致当前线程进入等待状态(time_waiting),timeout单位为毫秒,该方法只能同步方法或同步块中调用,超过设置时间后线程重新进入可运行状态
     66      */
     67     public final native void wait(long timeout) throws InterruptedException;
     68 
     69 
     70     public final void wait(long timeout, int nanos) throws InterruptedException {
     71         if (timeout < 0) {
     72             throw new IllegalArgumentException("timeout value is negative");
     73         }
     74 
     75         if (nanos < 0 || nanos > 999999) {
     76             throw new IllegalArgumentException(
     77                     "nanosecond timeout value out of range");
     78         }
     79 
     80         if (nanos > 0) {
     81             timeout++;
     82         }
     83 
     84         wait(timeout);
     85     }
     86 
     87     /**
     88      * 在其他线程调用此对象的notify()方法或notifyAll()方法前,导致当前线程等待。换句话说,此方法的行为就好像它仅执行wait(0)调用一样。
     89      * 当前线程必须拥有此对象监视器。
     90      * 该线程发布对此监视器的所有权并等待,直到其他线程通过调用notify方法或notifyAll方法通知在此对象的监视器上等待的线程醒来,
     91      * 然后该线程将等到重新获得对监视器的所有权后才能继续执行。
     92      */
     93     public final void wait() throws InterruptedException {
     94         wait(0);
     95     }
     96 
     97     /**
     98      * 这个方法用于当对象被回收时调用,这个由JVM支持,Object的finalize方法默认是什么都没有做,如果子类需要在对象被回收时执行一些逻辑处理,则可以重写finalize方法。
     99      */
    100     protected void finalize() throws Throwable {
    101     }
    102 }
  • 相关阅读:
    包装类型
    int 和 Integer 有什么区别
    final finally finalize区别
    java关键字final 有什么用?
    String和StringBuffer、StringBuilder的区别是什么?
    String 类的常用方法都有那些?
    Vue官网教程-计算属性和监听器
    Vue官网教程-模板语法
    Vue官网教程-实例
    Vue官网教程-介绍
  • 原文地址:https://www.cnblogs.com/wupeixuan/p/8620217.html
Copyright © 2011-2022 走看看