JDK8源码阅读(一) java.lang.Object

Object类的介绍:

Class Object是类Object结构的根。 每个班都有Object作为超类。 所有对象(包括数组)都实现了这个类的方法。

Object类的方法

5MS)DL_8Q2MJYBX55_IRW2Q.png

1. registerNatives()

1.1 本地方法是联系Java程序和底层主机操作系统的连接方法。

2. clone()

2.1
protected Object clone()throws CloneNotSupportedException

按照惯例,返回的对象应该通过调用super.clone获得。 如果一个类和它的所有超类(除了Object )遵守这个惯例,那将是x.clone().getClass() == x.getClass()的情况。

按照惯例,此方法返回的对象应该与此对象(正被克隆)无关。 为了实现这一独立性,可能需要修改super.clone返回的对象的一个或多个字段。 通常,这意味着复制构成被克隆的对象的内部“深层结构”的任何可变对象,并通过引用该副本替换对这些对象的引用。 如果一个类仅包含原始字段或对不可变对象的引用,则通常情况下, super.clone返回的对象中的字段通常不需要修改。

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

Object类本身并不实现接口Cloneable ,因此在类别为Object的对象上调用clone方法将导致运行时抛出异常。

3. equals

3.1.public boolean equals(Object obj)

3.2
equals方法在非空对象引用上实现等价关系:

自反性 :对于任何非空的参考值x , x.equals(x)应该返回true 。
它是对称的 :对于任何非空引用值x和y , x.equals(y)应该返回true当且仅当y.equals(x)回报true 。
传递性 :对于任何非空引用值x , y和z ,如果x.equals(y)回报true个y.equals(z)回报true ,然后x.equals(z)应该返回true 。
它是一致的 :对于任何非空引用值x和y ,多次调用x.equals(y)始终返回true或始终返回false ,没有设置中使用的信息equals比较上的对象被修改。
对于任何非空的参考值x , x.equals(null)应该返回false 。

4. finalize

4.1 protected void finalize() throws Throwable
4.2

当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。 一个子类覆盖了处理系统资源或执行其他清理的finalize方法。
finalize的一般合同是,如果Java¢虚拟机已经确定不再有任何方法可以被任何尚未死亡的线程访问的方法被调用,除非是由于最后确定的其他对象或类的准备工作所采取的行动。 finalize方法可以采取任何行动,包括使此对象再次可用于其他线程; 然而, finalize的通常目的是在对象不可撤销地丢弃之前执行清除动作。 例如,表示输入/输出连接的对象的finalize方法可能会在对象被永久丢弃之前执行显式I / O事务来中断连接.

5. getClass

5.1 public final 类 getClass()
5.2

返回此Object的运行时类。 返回的类对象是被表示类的static synchronized方法锁定的对象。

6.hashCode

6.1 public int hashCode()
6.2

只要在执行Java应用程序时多次在同一个对象上调用该方法, hashCode方法必须始终返回相同的整数,前提是修改了对象中equals比较中的信息。 该整数不需要从一个应用程序的执行到相同应用程序的另一个执行保持一致。
如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象上调用hashCode方法必须产生相同的整数结果。

7. notify

7.1 public final void notify()
7.2

唤醒正在等待对象监视器的单个线程。 如果任何线程正在等待这个对象,其中一个被选择被唤醒。 选择是任意的,并且由实施的判断发生。 线程通过调用wait方法之一等待对象的监视器。

8.notifyAll

8.1 public final void notifyAll()

8.2

唤醒正在等待对象监视器的所有线程。 线程通过调用wait方法之一等待对象的监视器。

9. toString

9.1 public String toString()
9.2

返回对象的字符串表示形式。 一般来说, toString方法返回一个“textually代表”这个对象的字符串。 结果应该是一个简明扼要的表达,容易让人阅读。 建议所有子类覆盖此方法。
该toString类方法Object返回一个由其中的对象是一个实例,该符号字符`的类的名称的字符串@ ”和对象的哈希码的无符号的十六进制表示。 换句话说,这个方法返回一个等于下列值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode())

10. wait()

10.1 public final void wait() throws InterruptedException
10.2

导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll().换句话说,这个方法的行为就好像简单地执行呼叫wait(0) 。
当前线程必须拥有此对象的监视器。线程释放此监视器的所有权,并等待直到另一个线程通过调用notify方法或notifyall方法通知等待此对象监视器的线程唤醒。然后线程等待,直到它可以重新获得监视器的所有权并继续执行。

11. wait(long timeout)

11.1 public final void wait(long timeout) throws InterruptedException
11.2

导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()或指定的时间已过
此方法使当前线程将自身置于此对象的等待集中,然后放弃此对象上的所有同步声明。出于线程调度目的,线程将被禁用,并处于休眠状态,直到发生以下四种情况之一:
1. 其他一些线程调用此对象的notify方法,而线程恰好被任意选择为要唤醒的线程;

  2. 其他一些线程为此对象调用notifyall方法;

  3. 其它一些线程interrupt方法终端当前线程;

  4. 指定的实时时间已过,或多或少。但是,如果超时为零,则不考虑实时性,线程只需等待通知;

12. wait(long timeout,int nanos)

12.1 public final void wait(long timeout,int nanos) throws InterruptedException
12.2

使当前线程等待,直到另一个线程为此对象调用notify方法或notifyall方法,或某个其他线程中断当前线程,或经过一定的实时时间
此方法类似于一个参数的wait方法,但它允许更好地控制在放弃之前等待通知的时间。以纳秒为单位的实时量表示为:1000000*timeout+nanos(纳秒)。在所有其他方面,此方法与一个参数的方法wait(long)执行相同的操作。特别地,wait(0,0)与wait(0)的含义相同;
当前的线程必须拥有该对象的显示器。 线程释放此监视器的所有权,并等待直到发生以下两种情况之一:

另一个线程通知等待该对象的监视器的线程通过调用notify方法或notifyAll方法来唤醒。
由timeout毫秒加nanos纳秒参数指定的超时时间已过。
然后线程等待,直到它可以重新获得监视器的所有权并恢复执行。

你可能感兴趣的:(JDK8源码阅读(一) java.lang.Object)