Java-API简析_java.lang.Object类(基于 Latest JDK)(浅析源码)

【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
https://blog.csdn.net/m0_69908381/article/details/133474051
出自【进步*于辰的博客

1、概述

public class Object

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

从以下版本开始:
1.0
另请参见:
Class<T>

2、构造方法摘要

2.1 null

构造一个新对象。

3、方法摘要

3.1 protected native Object clone()

创建并返回此对象的副本。

“copy”的确切含义可能取决于对象的类。一般的意图是,对于任何对象x,表达式:

x.clone() != x

将为 true,即表达式:

x.clone().getClass() == x.getClass()

将为 true,但这些不是绝对的要求。虽然通常情况是:

x.clone().equals(x)

将为 true,这不是一个绝对的要求。

按照惯例,返回的对象应该通过调用super.clone()来获得。如果一个类和它的所有超类(Object除外)都遵守这个约定,则会出现x.clone(). getclass() == x.getClass()的情况。

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

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

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

3.2 boolean equals​(Object obj)

指示某个其他对象是否“等于”此对象。

public boolean equals(Object obj) {
    return (this == obj);
}

3.3 protected void finalize()

已过时
最终确定机制本质上存在问题。

3.4 native Class<?> getClass()

返回此 Object 类运行时的 Class 对象。

返回的 Class 对象是由所表示类的 静态同步方法 \color{green}{静态同步方法} 静态同步方法锁定的对象。

实际的返回类型是Class<? extends |X|>,其中|X|是对调用getClass()的表达式的静态类型的擦除。例如,在这段代码中不需要强制类型转换:

Number n = 0;
Class<? extends Number> c = n.getClass();

3.5 native int hashCode()

返回对象的哈希码值(散列码值)。

支持此方法是为了使用哈希表,例如java.util.HashMap提供的哈希表。

哈希码的总约定是:

  • 在Java应用程序的执行过程中,只要在同一对象上多次调用hashCode(),此方法必须始终返回相同的整数,前提是对象上用于相等比较的信息没有被修改。该整数不必在应用程序的一次执行与另一次执行之间保持一致。
  • 如果根据equals(Object obj)方法比较的两个对象相等,那么对这两个对象中的每一个调用hashCode()必须产生相同的整数结果。
  • 如果根据equals(Object obj)方法比较的两个对象不相等,则不要求对这两个对象中的任一个调用hashCode()必须产生不同的整数结果。然而,程序员应该意识到,为不相等的对象生成不同的整数结果可能会提高哈希表的性能。

在合理可行的情况下,由 Object 类定义的hashCode()确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但是Java编程语言不需要这种实现技术。)

3.6 native void notify()

唤醒正在此对象监视器上等待的单个线程。

唤醒在该对象的监视器上等待的单个线程。如果有任何线程正在等待此对象,则会选择其中一个线程进行唤醒。这种选择是任意的,由执行人员自行决定。线程通过调用其中一个等待方法来等待对象的监视器。

在当前线程放弃对此对象的锁定之前,唤醒的线程将无法继续。唤醒的线程将以通常的方式与可能在该对象上主动竞争同步的任何其他线程竞争;例如,被唤醒的线程在成为下一个锁定该对象的线程时没有可靠的特权或劣势。

此方法只能由作为此对象监视器所有者的线程调用。线程通过以下三种方式之一成为对象监视器的所有者:

  • 通过执行该对象的同步实例方法。
  • 通过执行在对象上同步的同步语句的主体。
  • 对于Class类型的对象,通过执行该类的同步静态方法。

一次只有一个线程可以拥有对象的监视器。

3.7 native void notifyAll()

唤醒等待此对象监视器的所有线程。

唤醒在该对象的监视器上等待的所有线程。线程通过调用其中一个等待方法来等待对象的监视器。

在当前线程放弃对此对象的锁定之前,唤醒的线程将无法继续。唤醒的线程将以通常的方式与可能在该对象上主动竞争同步的任何其他线程竞争;例如,被唤醒的线程在成为下一个锁定该对象的线程时没有可靠的特权或劣势。

此方法只能由作为此对象监视器所有者的线程调用。有关线程成为监视器所有者的方式的描述,请参阅notify()

3.8 String toString()

返回对象的字符串表示形式。

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

hashCode()见第5项,toHexString()Integer类的第4.28项。

3.9 void wait()

导致当前线程等待它被唤醒,通常是“通知”或“中断”。

public final void wait() throws InterruptedException {
    wait(0);// 调用下1项
}

3.10 native void wait​(long timeoutMillis)

导致当前线程等待它被唤醒,通常是“通知”或“中断”,或者直到经过一定量的实时。

使当前线程等待,直到另一个线程调用该对象的notify()notifyAll(),或者经过指定的时间。

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

此方法导致当前线程(称为T)将自己放置在此对象的等待集中,然后放弃对此对象的任何和所有同步声明。线程T出于线程调度目的而被禁用,并处于休眠状态,直到发生以下四种情况之一:

  • 其他一些线程调用该对象的notify(),而线程T恰好被任意选择为要唤醒的线程。
  • 其他一些线程调用该对象的notifyAll()
  • 一些其他线程中断线程T。
  • 或多或少已经过了指定的实时量。然而,如果超时为零,则不考虑实时性,线程只需等待通知。

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

线程也可以在没有被通知、中断或超时的情况下唤醒,这就是所谓的虚假唤醒。虽然这种情况在实践中很少发生,但应用程序必须通过测试本应导致线程被唤醒的条件来防止这种情况,如果条件不满足,则继续等待。换句话说,等待应该总是发生在循环中,就像下面这样:

synchronized (obj){
   while (<condition does not hold>)
       obj.wait(timeout);
   ... // Perform action appropriate to condition
}

如果当前线程在等待之前或等待期间被任何线程中断,则会引发InterruptedException。在如上所述恢复此对象的锁定状态之前,不会引发此异常。

请注意wait()在将当前线程放入该对象的等待集中时,仅解锁该对象;当线程等待时,当前线程可以在其上同步的任何其他对象保持锁定。

此方法只能由作为此对象监视器所有者的线程调用。有关线程成为监视器所有者的方式的描述,请参阅notify()

3.11 void wait​(long timeoutMillis, int nanos)

导致当前线程等待它被唤醒,通常是“通知”或“中断”,或者直到经过一定量的实时。

public final void wait(long timeout, int nanos) throws InterruptedException {
    if (timeout < 0) {
        throw new IllegalArgumentException("timeout value is negative");
    }

	// timeout 的单位是“毫秒”,nanos 的单位是“纳秒”,转换量级是 10 的 6 次方
    if (nanos < 0 || nanos > 999999) {
        throw new IllegalArgumentException(
                            "nanosecond timeout value out of range");
    }

    if (nanos > 0) {
        timeout++;
    }

    wait(timeout);// 调用上1项
}

最后

如果大家需要Java-API文档,我上传了《Java-API文档-包含5/8/11三个版本》。


本文暂缓更新。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进步·于辰

谢谢打赏!!很高兴可以帮到你!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值