JDK1.8源码学习--lang包(Object)

前言
 


月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂)

央是一片海洋,海乃百川,代表着一块海绵(吸纳万物)

泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出)

月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容

希望大家一起坚持这个过程,也同样希望大家最终都能从零到零,把知识从薄变厚,再由厚变薄!
 

一.Object的作用:

        直接看源码注释(我的翻译可能不太准,如果道友们有更棒的理解,可以留言或者私信)

/**
 * Class {@code Object} is the root of the class hierarchy.
 * Every class has {@code Object} as a superclass. All objects,
 * including arrays, implement the methods of this class.
 *类 Object是类层次结构的根。每个类都有 Object作为超类。所有对象,包括数组,都实现了这个类的方法
 * @author  unascribed
 * @see     java.lang.Class
 * @since   JDK1.0
 */

二.内部方法: 

                getClass()

   /**
     * Returns the runtime class of this {@code Object}. The returned
     * {@code Class} object is the object that is locked by {@code
     * static synchronized} methods of the represented class.
     * 1.返回此 Object的运行时类。返回的Class对象是被代表类的static synchronized方法锁定的对象。
     * 

The actual result type is {@code Class} * where {@code |X|} is the erasure of the static type of the * expression on which {@code getClass} is called. For * example, no cast is required in this code fragment:

* 2.实际的结果类型是Class其中 |X| 是对调用 getClass的表达式的静态类型的擦除 * 3.例如,此代码片段中不需要强制转换: * 数 n = 0; * Class c = n.getClass(); *

* {@code Number n = 0; }
* {@code Class c = n.getClass(); } *

* * @return The {@code Class} object that represents the runtime * class of this object. * @jls 15.8.2 Class Literals */ public final native Class getClass();

                hashCode()

  /**
     * 1.返回对象的哈希码值。支持此方法是为了有利于散列表,例如 java.util.HashMap提供的散列表。
     *  1)每当在 Java 应用程序执行期间在同一对象上多次调用它时,hashCode
     *  方法必须始终返回相同的整数,前提是在对象的 equals比较中使用的信息没有被修改。
     *  该整数不需要从应用程序的一次执行到同一应用程序的另一次执行保持一致。
     *    2)如果两个对象根据equals(Object)方法相等,则对两个对象中的每一个调用hashCode方法必须产生相同的整数结果。
     *     3)如果根据 java.lang.Object.equals(java.lang.Object)方法,不要求两个对象不相等,
     *     则在每个对象上调用hashCode方法,两个对象必须产生不同的整数结果。
     *     但是,程序员应该意识到为不相等的对象生成不同的整数结果可能会提高哈希表的性能。
     * 3.尽管合理实用,类Object定义的 hashCode 方法确实为不同的对象返回不同的整数。 
     * (这通常是通过将对象的内部地址转换为整数来实现的,但是 Java™ 编程语言不需要这种实现技术。)
     */
    public native int hashCode();

                equals

  /**
     * 1.指示其他某个对象是否“等于”这个对象
     * 2.equals方法在非空对象引用上实现等价关系:
     *   1)它是反身的的,对于任何非空引用值 x,x.equals(x)应该返回 true。
     *     2)对称:对于任何非空引用值x和y,当且仅当x.equals(y)应该返回true,y.equals(x)返回true。

     *     3)传递:对于任何非空引用值x、y和 z,如果 x.equals(y)返回 true和y.equals(z)返回true,
     *     那么x.equals(z)应该返回 true。

     *     4)一致:对于任何非空引用值x和y,多次调用x.equals(y)始终返回true或始终返回 false,
     *     前提是未修改对象的equals比较中使用的信息
     *     3.对于任何非空引用值x,x.equals(null) 应该返回 false
     *  4.Object类的equals方法在对象上实现了最具辨别力的可能等价关系;也就是说,
     *  对于任何非空引用值x和y,当且仅当x和 y引用同一个对象时,此方法才返回true ( x == y的值为 true)
     * 5.请注意,每当此方法被覆盖时,通常都需要覆盖hashCode方法,以维护hashCode方法的一般约定,
     * 即相等的对象必须具有相同的哈希码。
     */
    public boolean equals(Object obj) {
        return (this == obj);
    }

                clone

    /**
     * 1.创建并返回此对象的副本。 “复制”的确切含义可能取决于对象的类别
     * 2.一般意图是,对于任何对象x,表达式:x.clone() != x将是真的,并且表达式:

     * 3.按照惯例,返回的对象应该通过调用super.clone来获取。如果一个类和它的所有超类(Object除外)都遵守这个约定,
     * 那么 x.clone().getClass() == x.getClass()就是这种情况。

     * 4.按照惯例,这个方法返回的对象应该独立于这个对象(它被克隆)。为了实现这种独立性,
     * 可能需要在返回之前修改super.clone返回的对象的一个或多个字段。
     * 通常,这意味着复制包含被克隆对象的内部“深层结构”的任何可变对象,
     * 并将对这些对象的引用替换为对副本的引用。如果一个类只包含原始字段或对不可变对象的引用,
     * 那么通常情况下,super.clone返回的对象中没有字段需要修改

     * 5.Object类的方法clone执行特定的克隆操作。首先,如果这个对象的类没有实现接口Cloneable,
     * 则抛出一个CloneNotSupportedException。请注意,所有数组都被认为实现了接口Cloneable,并且数组类型 T[]
     * 的clone方法的返回类型是 T[],其中 T 是任何引用或原始类型。否则,此方法将创建此对象的类的新实例,
     * 并使用此对象的相应字段的内容来初始化其所有字段,就像通过赋值一样;字段的内容本身不会被克隆。
     * 因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作。

     * 6.Object类本身并没有实现Cloneable接口,因此在类为Object的对象上调用clone方法会导致在运行时抛出异常

     */
    protected native Object clone() throws CloneNotSupportedException;

                toString()

    /**
     * 1.返回对象的字符串表示形式。通常,toString方法返回一个“文本表示”此对象的字符串。
     * 结果应该是一个简洁但信息丰富的表示,易于人们阅读。
     * 2.建议所有子类都覆盖此方法
     * 3.Object类的 toString方法返回一个字符串,该字符串由对象是其实例的类的名称、at-sign 字符 `@' 
     * 和无符号的十六进制表示组成对象的哈希码。
     * 4.换句话说,这个方法返回一个等于以下值的字符串:getClass().getName() + '@' + Integer.toHexString(hashCode())
     */
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

                notify

    /**
     * 1.唤醒在此对象的监视器上等待的单个线程。如果有任何线程正在等待这个对象,则选择其中一个线程被唤醒。
     * 选择是任意的,并由实现自行决定。线程通过调用wait方法之一在对象的监视器上等待。

     * 2.被唤醒的线程将无法继续,直到当前线程放弃对该对象的锁定。
     * 被唤醒的线程将以通常的方式与可能正在积极竞争以同步该对象的任何其他线程进行竞争;
     * 例如,被唤醒的线程在成为下一个锁定该对象的线程时没有可靠的特权或劣势。

     * 3.此方法只能由作为此对象监视器的所有者的线程调用。
     * 线程通过以下三种方式之一成为对象监视器的所有者:
     *  1)通过执行该对象的同步实例方法。
     *  2)通过执行在对象上同步的 synchronized语句的主体。
     *  3)对于Class类型的对象,通过执行该类的同步静态方法
     */
    public final native void notify();

    /**

     * 1.唤醒在此对象监视器上等待的所有线程。线程通过调用 wait方法之一在对象的监视器上等待
     * 2.被唤醒的线程将无法继续,直到当前线程放弃对该对象的锁定。
     * 被唤醒的线程将以通常的方式与可能正在积极竞争以同步此对象的任何其他线程进行竞争;
     * 例如,被唤醒的线程在成为下一个锁定该对象的线程时不享有可靠的特权或劣势。
     * 3.此方法只能由作为此对象监视器的所有者的线程调用。有关线程可以成为监视器所有者的方式的描述,请参阅 notify 方法。
     */
    public final native void notifyAll();

                wait()


    /**
     * 1.导致当前线程等待,直到另一个线程为此对象调用 java.lang.Objectnotify()方法或 
     * java.lang.ObjectnotifyAll()方法,或者指定的时间已经过去.

     * 2.当前线程必须拥有此对象的监视器。

     * 3.此方法使当前线程(称为T)将自己置于此对象的等待集中,然后放弃对该对象的任何和所有同步声明。

     * 4.线程T出于线程调度目的而被禁用并处于休眠状态,直到发生以下四种情况之一:
     *  1)某些其他线程为此对象调用 notify方法,并且线程 T恰好被任意选择为要唤醒的线程

     * 2)其他一些线程为此对象调用 notifyAll 方法。

     * 3)其他一些线程 Threadinterrupt() 中断线程 T

     * 4)或多或少已经过了指定的实时时间。但是,如果 timeout为零,则不考虑实时时间,线程只是等待直到收到通知

     * 5.线程 T 然后从这个对象的等待集中移除,并重新启用线程调度。然后它以通常的方式与其他线程竞争在对象上同步的权利;
     * 一旦它获得了对象的控制权,它对对象的所有同步声明都将恢复到之前的状态——也就是说,恢复到调用 wait方法时的情况。
     * 线程 T然后从 wait方法的调用中返回。因此,从 wait方法返回时,对象和线程T的同步状态与调用wait法时完全相同

     * 6.线程也可以在没有被通知、中断或超时的情况下唤醒,即所谓的虚假唤醒。
     * 虽然这在实践中很少发生,但应用程序必须通过测试应该导致线程被唤醒的条件来防止它,如果条件不满足则继续等待

     * ps:有关此主题的更多信息,请参阅 Doug Lea 的“Java 中的并发编程(第二版)

     * 7.如果当前线程在等待之前或期间被任何线程java.lang.Threadinterrupt() 中断,
     * 则抛出InterruptedException。在如上所述恢复此对象的锁定状态之前,不会抛出此异常

     * 8.请注意,wait方法将当前线程放入此对象的等待集中,因此仅解锁此对象;当前线程可能同步的任何其他对象在线程等待时保持锁定

     * 9.此方法只能由作为此对象监视器的所有者的线程调用。有关线程可以成为监视器所有者的方式的描述,请参阅 notify方法。
     */
    public final native void wait(long timeout) throws InterruptedException;

    /**
     * 1.使当前线程等待,直到另一个线程为此对象调用 java.lang.Objectnotify()方法或 java.lang.ObjectnotifyAll() 方法,
     * 或者其他一些线程中断当前线程,或者经过了一定的实时时间。
     * 2.此方法类似于一个参数的 wait 方法,但它允许更好地控制在放弃之前等待通知的时间量。
     * 实时量,以纳秒为单位,由下式给出:1000000timeout+nanos

     * 3.在所有其他方面,此方法与一个参数的方法  wait(long)执行相同的操作。
     * 特别是,wait(0, 0)与 wait(0) 的含义相同

     *     4.当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,直到发生以下两个条件之一: 
     *     另一个线程通知在此对象监视器上等待的线程通过调用 notify法或notifyAll方法。
     *     由 timeout毫秒加上nanos纳秒参数指定的超时时间已经过去。

     * 5.然后线程等待直到它可以重新获得监视器的所有权并恢复执行。

     * 6.此方法只能由作为此对象监视器的所有者的线程调用。有关线程可以成为监视器所有者的方式的描述,请参阅 notify方法。
     */
    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);
    }

    /**
     * 1.使当前线程等待,直到另一个线程为此对象调用java.lang.Object.notify()方法或 java.lang.Object.notifyAll()方法。
     * 换句话说,此方法的行为就像它只是执行调用wait(0)一样。

     * 2.当前线程必须拥有此对象的监视器。线程释放此监视器的所有权并等待,
     * 直到另一个线程通知在此对象监视器上等待的线程通过调用 notify方法或notifyAll方法唤醒。
     * 然后线程等待直到它可以重新获得监视器的所有权并恢复执行。

     * 3.此方法只能由作为此对象监视器的所有者的线程调用。有关线程可以成为监视器所有者的方式的描述,请参阅 notify方法。
     */
    public final void wait() throws InterruptedException {
        wait(0);
    }

                finalize

    /**
     * 1.当垃圾收集确定不再有对对象的引用时,由垃圾收集器在对象上调用。子类覆盖finalize方法来处理系统资源或执行其他清理。
     * 2.finalize的一般约定是,当 Java™ 虚拟机确定不再有任何方法可以让任何尚未死的线程访问此对象时调用它,
     * 除非作为某个其他准备好被终结的对象或类的终结所采取的行动的结果。 finalize方法可以执行任何操作,
     * 包括使该对象再次可供其他线程使用;然而,finalize的通常目的是在对象被不可撤销地丢弃之前执行清理操作。
     * 例如,表示输入输出连接的对象的 finalize 方法可能会执行显式 IO 事务以在对象被永久丢弃之前断开连接

     * 3.Object类的 finalize方法不执行任何特殊操作;它只是正常返回。 Object的子类可能会覆盖此定义。
     * 4.Java 编程语言不保证哪个线程将调用任何给定对象的finalize方法。
     * 但是,可以保证调用 finalize 的线程在调用 finalize 时不会持有任何用户可见的同步锁。
     * 如果 finalize 方法抛出未捕获的异常,则忽略该异常并终止该对象的终结。

     * 5.在为一个对象调用了finalize方法后,不会采取进一步的行动,
     * 直到 Java 虚拟机再次确定没有任何方法可以让任何尚未死亡的线程访问该对象,
     * 包括准备好完成的其他对象或类的可能操作,此时该对象可能会被丢弃。

     * 6.finalize方法永远不会被 Java 虚拟机对任何给定对象调用多次

     * 7.finalize方法抛出的任何异常都会导致该对象的终结被暂停,但会被忽略。
     */
    protected void finalize() throws Throwable { }

三.总结

        object,应该是大家最熟悉,但又最陌生的一个类了....

你可能感兴趣的:(jdk源码,p2p,蓝桥杯,linq)