Object 有哪些常用方法

2022-06-10 21:24:20 浏览数 (1)

Object 是所有类的父类,任何类都默认继承 Object。Object 类到底实现了哪些方法?

(1)clone方法

保护方法,实现对象的浅复制,只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。

(2)getClass方法

final方法,获得运行时类型。

(3)toString方法

该方法用得比较多,一般子类都有覆盖。

(4)finalize方法

该方法用于释放资源。因为无法确定该方法什么时候被调用,很少使用。

(5)equals方法

该方法是非常重要的一个方法。一般equals和==是不一样的,但是在Object中两者是一样的。子类一般都要重写这个方法。

(6)hashCode方法

该方法用于哈希查找,重写了equals方法一般都要重写hashCode方法。这个方法在一些具有哈希功能的Collection中用到。

一般必须满足obj1.equals(obj2)==true。可以推出obj1.hash- Code()==obj2.hashCode(),但是hashCode相等不一定就满足equals。不过为了提高效率,应该尽量使上面两个条件接近等价。

(7)wait方法

wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait()方法一直等待,直到获得锁或者被中断。wait(long timeout)设定一个超时间隔,如果在规定时间内没有获得锁就返回。

调用该方法后当前线程进入睡眠状态,直到以下事件发生。

(1)其他线程调用了该对象的notify方法。

(2)其他线程调用了该对象的notifyAll方法。

(3)其他线程调用了interrupt中断该线程。

(4)时间间隔到了。

此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException异常。

(8)notify方法

该方法唤醒在该对象上等待的某个线程。

(9)notifyAll方法

该方法唤醒在该对象上等待的所有线程。

代码语言:javascript复制
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package java.lang;

public class ObjectTest {
    /**
     * 构造方法
     */
    public Object() {
    }

    /**
     *  为了使JVM发现本机功能,他们被一定的方式命名。
     *  例如,对于java.lang.Object.registerNatives,
     *  对应的C函数命名为Java_java_lang_Object_registerNatives。
     *
     *  通过使用registerNatives(或者更确切地说,JNI函数RegisterNatives),可以命名任何你想要你的C函数。
     */
    private static native void registerNatives();

    /**
     * final方法,用于获得运行时的类型。
     * 该方法返回的是此Object对象的类对象/运行时类对象Class。效果与Object.class相同。
     *
     *  Object obj = new Object();
     *  obj.getClass() == Object.class
     *
     */
    public final native Class<?> getClass();

    /**
     * 该方法用来返回其所在对象的物理地址(哈希码值),
     * 常会和equals方法同时重写,确保相等的两个对象拥有相等的hashCode。
     */
    public native int hashCode();

    /**
     * equals用来比较两个对象的内容是否相等。
     * 默认情况下(继承自Object类),equals和==是一样的,除非被覆写(override)了。
     */
    public boolean equals(Object var1) {
        return this == var1;
    }

    /**
     * clone()函数的用途是用来另存一个当前存在的对象。
     * 只有实现了Cloneable接口才可以调用该方法,否则抛出CloneNotSupportedException异常。
     */
    protected native Object clone() throws CloneNotSupportedException;

    /**
     * toString()方法返回该对象的字符串表示,这个方法没什么可说的。
     * 一般会被覆写
     */
    public String toString() {
        return this.getClass().getName()   "@"   Integer.toHexString(this.hashCode());
    }

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

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

    /**
     * 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。
     */
    public final native void wait(long var1) throws InterruptedException;

    /**
     * 导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,
     * 或者其他某个线程中断当前线程,或者已超过某个实际时间量。
     */
    public final void wait(long var1, int var3) throws InterruptedException {
        if (var1 < 0L) {
            throw new IllegalArgumentException("timeout value is negative");
        } else if (var3 >= 0 && var3 <= 999999) {
            if (var3 > 0) {
                  var1;
            }

            this.wait(var1);
        } else {
            throw new IllegalArgumentException("nanosecond timeout value out of range");
        }
    }

    /**
     *  导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。
     */
    public final void wait() throws InterruptedException {
        this.wait(0L);
    }

    /**
     * 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
     */
    protected void finalize() throws Throwable {
    }

    static {
        registerNatives();
    }
}

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可 Links: https://cloud.tencent.com/developer/article/2020518

0 人点赞