从源码分析Object类的常用方法

x33g5p2x  于2021-12-11 转载在 其他  
字(2.1k)|赞(0)|评价(0)|浏览(344)

Object类位于java.lang包中,每个类都有Object作为超类,包括我们自定义的类,定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类。。 所有对象(包括数组)都实现了这个类的方法。

Object类中提供了以下方法:

getClass()

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

public final native Class<?> getClass();

hashCode()

返回对象的哈希码值。

public native int hashCode();

equals(Object obj)

指示一些其他对象是否等于此对象。

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

clone()

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

protected native Object clone() throws CloneNotSupportedException;

toString()

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

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

notify()

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

唤醒的线程将无法继续,直到当前线程放弃此对象上的锁定为止。 唤醒的线程将以通常的方式与任何其他线程竞争。

public final native void notify();

notifyAll()

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

public final native void notifyAll();

wait(long timeout)

导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法,或指定的时间已过。

public final native void wait(long timeout) throws InterruptedException;

wait(long timeout, int nanos)

导致当前线程等待,直到另一个线程调用此对象的notify()方法或notifyAll()方法,或其他一些线程中断当前线程,或一定量的实时时间。

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

wait()

导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法。 换句话说,这个方法的行为就好像简单地执行wait(0) 。

public final void wait() throws InterruptedException {
        wait(0);
    }

finalize()

当垃圾回收器确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。 一个子类覆盖了处理系统资源或执行其他清理的finalize方法。

finalize的一般协议是,如果Java虚拟机已经确定不再有任何方法可以被任何尚未死亡的线程访问的方法被调用,除非是由于最后确定的其他对象或类的准备工作所采取的行动。 finalize方法可以采取任何行动,包括使此对象再次可用于其他线程; 然而, finalize的通常目的是在对象不可撤销地丢弃之前执行清除动作。 例如,表示输入/输出连接的对象的finalize方法可能会在对象被永久丢弃之前执行显式I / O事务来中断连接。

所述finalize类的方法Object执行任何特殊操作; 它只是返回正常。

Java编程语言不能保证哪个线程将为任何给定的对象调用finalize方法。 但是,确保调用finalize的线程在调用finalize时不会持有任何用户可见的同步锁。 如果finalize方法抛出未捕获的异常,则会忽略该异常,并终止该对象的定类。

在为对象调用finalize方法之后,在Java虚拟机再次确定不再有任何方式可以通过任何尚未被死亡的线程访问此对象的任何方法的情况下,将采取进一步的操作,包括可能的操作由准备完成的其他对象或类别,此时可以丢弃对象。

finalize方法从不被任何给定对象的Java虚拟机调用多次。

finalize方法抛出的任何异常都会导致该对象的终止被停止,否则被忽略。

protected void finalize() throws Throwable { }

相关文章