05-Object类分析

发布于:2022-12-31 ⋅ 阅读:(404) ⋅ 点赞:(0)

Object类分析

1. 概述

​ Class Object is the root of the class hierarchy. Every class has Object as a superclass. All objects, including arrays, implement the methods of this class.

【类对象是类层次结构的根。每个类都有一个 Object 作为超类。所有对象,包括数组,都实现了这个类的方法】

2. 类源码

package java.lang;

public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }
    public final native Class<?> getClass();

    public native int hashCode();

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

    protected native Object clone() throws CloneNotSupportedException;

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

    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);
    }

    protected void finalize() throws Throwable { }
}

3. 各方法详解

3.1 registerNatives()

private static native void registerNatives();
static {
    registerNatives();
}
  • 先定义了registerNatives()方法,然后当该类被加载的时候,调用该方法完成对该类中本地方法的注册
  • 注册的方法就是该类所包含的除了registerNatives()方法以外的所有本地方法
  • 一个Java程序要想调用一个本地方法,需要执行两个步骤:
    • 第一,通过System.loadLibrary()将包含本地方法实现的动态文件加载进内存;
    • 第二,当Java程序需要调用本地方法时,虚拟机在加载的动态文件中定位并链接该本地方法,从而得以执行本地方法。
  • registerNatives()方法的作用就是取代第二步,让程序主动将本地方法链接到调用方,当Java程序需要调用本地方法时就可以直接调用,而不需要虚拟机再去定位并链接。

3.2 getClass()

public final native Class<?> getClass();
  • 获取此对象对应的Class对象
  • 该方法不可被重写
  • 其中,Class<?> 其实是起到接收的作用
  • 原因是:这不是一个通过new创建的对象,因为当用new创建对象时,如果有涉及泛型,我们要对这个对象进行泛型类型的确定和传递,而getClass方法已经替我们做了创建对象,并传入泛型类型的工作,我们只需要做接收工作就可以了。而这与方法中实参传递给形参的过程相同。因此我们可以使用<?>进行泛型类型的接收。同样的,也可以使用泛型通配符的边界内容,例如Class<? extends Number> (只能接收类型为Number的子类的对象),但要注意通配符的内容必须包含getClass返回来的类型。

3.3 hashCode()

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

3.4 equals()

public boolean equals(Object obj) {
    return (this == obj);
}
  • 比较两个对象的地址是否相等
  • 每当重写此方法时,通常都需要重写 hashCode 方法,以维护 hashCode 方法的一般约定,即相等的对象必须具有相等的哈希码。

3.5 clone()

protected native Object clone() throws CloneNotSupportedException;
  • 创建并返回此对象的副本
  • 如果这个对象的类没有实现接口Cloneable,则抛出CloneNotSupportedException
  • 所有数组都被认为实现了接口 Cloneable,并且数组类型 T[] 的克隆方法的返回类型是 T[],其中 T 是任何引用或原始类型
  • 此方法执行此对象的“浅拷贝”,而不是“深拷贝”操作

3.6 toString()

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
  • Object 类的 toString 方法返回一个字符串,该字符串由对象的类名称、 字符“@”和对象哈希码的无符号十六进制表示组成

3.7 notify()

public final native void notify();
  • 唤醒在此对象的监视器上等待的单个线程

3.8 notifyAll()

public final native void notifyAll();
  • 唤醒在此对象监视器上等待的所有线程

3.9 wait(long timeout)

public final native void wait(long timeout) throws InterruptedException;
  • 导致当前线程阻塞,放弃已经占有的锁
  • 直到另一个线程为此对象调用 notify() 方法或 notifyAll() 方法,或者指定的时间量已经过去。

3.10 wait(long timeout, int nanos)

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);
}
  • 使当前线程等待,直到另一个线程为此对象调用notify() 方法或notifyAll() 方法,或者某个其他线程中断了当前线程,或者经过了一定的实时时间【毫秒+纳秒】。

3.11 wait()

public final void wait() throws InterruptedException {
    wait(0);
}
  • 使当前线程等待,直到另一个线程为此对象调用 notify() 方法或 notifyAll() 方法。换句话说,这个方法的行为就像它只是执行调用 wait(0) 一样。

3.12 finalize()

protected void finalize() throws Throwable { }
  • 当垃圾收集器确定不再有对对象的引用时,由垃圾收集器在对象上调用。子类覆盖 finalize 方法以处理系统资源或执行其他清理。
  • finalize 的通常目的是在对象被不可撤销地丢弃之前执行清理操作
本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到