Java中Object方法的所有函数(详细版)

private static native void registerNatives();
    static {
        registerNatives();
    }

①registerNatives():当Java程序需要调用本地方法时,虚拟机在加载的动态文件中定位并链接该本地方法,从而得以执行本地方法。

public final native Class<?> getClass();

②getClass():返回此Object的运行时类。返回的Class对象是被表示类的静态同步方法锁定的对象。

public native int hashCode();

③hashCode():返回对象的哈希代码值。
        hashCode的一般约定是:

  • 在Java应用程序的执行过程中,只要在同一个对象上不止一次调用hashCode方法,该方法必须一致地返回相同的整数,前提是在对象上的equals比较中使用的信息没有被修改。该整数在应用程序的一次执行与同一应用程序的另一次执行之间不必保持一致。
  • 如果两个对象根据equals(Obiect) 方法是相等的,那么在两个对象上调用hashCode方法必须产生相同的整数结果。
  • 如果两个对象根据equals(Object) 方法是不相等的,那么在两个对象上调用hashCode方法必须产生不同的整数结果。然而,程序员应该意识到,为不平等的对象生成不同的整数结果可能会提高哈希表的性能。
public boolean equals(Object obj) {
        return (this == obj);
    }

④equals():指示其他对象是否与此对象“相等”,equals方法在非空对象引用上实现一个等价关系,返回值是布尔类型。

protected native Object clone() throws CloneNotSupportedException;

⑤clone():创建并返回此对象的副本。“复制”的确切含义可能取决于对象的类。一般的意图是,对于任何对象x,表达式:x.clone ()!=x将为真,并且该表达式:x.clone().getClass() == x.getClass()
将是真实的,但这些都不是绝对的要求。而通常情况是:x.clone () .equals (x)会是真的,这并不是绝对的要求。
        按照约定,返回的对象应该通过调用超级获得。它是它的复制品。如果一个类及其所有超类(对象除外)都遵循这个约定,那么x.clon()就是这种情况。Getclass()=xgetClass()。按照约定,此方法返回的对象应该独立于此对象(正被克隆)。为了实现这种独立性,在返回super.clone返回的对象之前,可能需要修改它的一个或多个字段。通常这意味着复制任何包含被克隆对象的内部“深层结构”的可变对象,并将对这些对象的引用替换为对副本的引用。如果一个类只包含基元字段或对不可变对象的引用,那么通常情况下,super.clone返回的对象中没有字段。需要修改。

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

⑥toString():返回对象的字符串表示形式。一般情况下,tostring方法返回一个“文本表示”对象的字符串。结果应该是一个简洁但信息丰富的表示,是一个人很容易阅读。建议所有子类重写此方法。
类obiect的toString方法返回一个字符串,该字符串由该对象是其实例的类的名称at-sign字符d和该对象的哈希代码的无符号十六进制表示形式组成。换句话说,这个方法返回一个字符串,其值等于:getClass().getName() + '@' + Integer.toHexString(hashCode())返回:对象的字符串表示形式。

public final native void notify();

⑦notify():唤醒正在此对象监视器上等待的单个线程。如果有任何线程在此对象上等待,则选择其中一个被唤醒。的选择是任意的,发生在自由裁量权的实施。线程通过调用其中一个等待方法在对象的监视器上等待。
        在当前线程放弃此对象的锁之前,唤醒的线程将无法继续。唤醒的线程将按照通常的方式与可能在此对象上积极竞争以同步的任何其他线程竞争;例如,唤醒的线程在作为下一个锁定该对象的线程时没有可靠的特权或缺点。
        此方法只能由作为此对象监视器所有者的线程调用。线程通过以下三种方式成为对象监视器的所有者:

  • 通过执行该对象的同步实例方法
  • 通过执行同步对象的同步语句体
  • 对于class类型的对象,通过执行该类的同步静态方法一次只有一个线程可以拥有对象的监视器。
public final native void notifyAll();

⑧notifyAll():唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个等待方法在对象的监视器上等待。
        在当前线程放弃此对象的锁之前,唤醒的线程将无法继续执行。唤醒的线程将按照通常的方式与可能在此对象上积极竞争以同步的任何其他线程竞争,例如,唤醒的线程在作为下一个锁定该对象的线程时没有任何可靠的特权或缺点。此方法只能由作为此对象监视器所有者的线程调用。

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

⑨wait(long):使当前线程等待,直到另一个线程为此对象调用notify () 方法或notifyAll) 方法,或者经过指定的时间量。
        当前线程必须拥有该对象的监视器。此方法使当前线程(称之为7)将自己置于该对象的等待集中,然后放弃对该对象的任何和所有同步声明。为了线程调度的目的,线程T变为禁用状态,并处于休眠状态,直到出现以下四种情况之一:

  • 某个其他线程调用该对象的notify方法,该线程碰巧被任意选择为要唤醒的线程。
  • 其他一些线程为该对象调用notifyAll方法
  • 其他一些线程中断线程T。
  • 规定的实时时间已经过去了,或多或少。但是,如果超时时间为零,则不考虑实时性线程只是等待通知。

        然后从该对象的等待集中删除线程Tis,并重新启用线程调度。然后,它以通常的方式与其他线程竞争对对象的同步权,一旦它获得了对对象的控制,它对对象的所有同步声明都恢复到以前的状态-也就是说,恢复到调用wait方法时的状态。线程Tthen从调用wait方法返回因此,在从wait方法返回时,对象和线程T的同步状态与调用wait方法时完全一样,线程也可以在没有通知中断或超时的情况下被唤醒,这就是所谓的虚假唤醒。虽然这在实践中很少发生但应用程序必须通过测试应该导致线程被唤醒的条件来防范它,如果条件不满足则继续等待。

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(long,int):使当前线程等待,直到另一个线程为此对象调用notify(方法或notifyAll ()方法,或其他线程中断当前线程,或经过一定的实际时间。此方法类似于一个参数的等待方法,但它允许更好地控制在放弃之前等待通知的时间量。的实时时间量,以纳秒为单位,由1000000*超时+纳米
在所有其他方面,这个方法做的事情和方法wait (long)一个参数一样。特别是wait (0,0)和wait (0) 的意思是一样的。当前线程必须拥有该对象的监视器。线程释放此监视器的所有权并等待直到出现以下两种情况之一:

  • 另一个线程通过调用notify方法或notifyAll方法来通知在该对象的监视器上等待的线程唤醒。
  • 由超时毫秒加纳秒参数指定的超时周期已经过去

然后,线程等待,直到它可以重新获得监视器的所有权,并继续执行。

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

⑪wait():使当前线程等待,直到另一个线程为此对象调用notify (方法或notifyAll ()方法。换句话说,这个方法的行为就像它只是执行调用等待(0)一样。当前线程必须拥有该对象的监视器。线程释放此监视器的所有权,并等待另一个线程通过调用notify方法或notifyAll方法通知等待在此对象的监视器上的线程唤醒。然后,线程等待,直到它可以重新获得监视器的所有权,并继续执行。

protected void finalize() throws Throwable { }

⑫finalize():当垃圾回收确定不再有对对象的引用时,由垃圾回收器在对象上调用。子类重写finalize方法以释放系统资源或执行其他清理
        finalize的一般契约是当Java"虚拟机已确定,任何尚未死亡的线程都无法再通过任何方式访问该对象,除非是由于某个准备结束的其他对象或类的终结所采取的操作的结果。finalize方法可以执行任何操作,包括使该对象再次对其他线程可用;然而finalize的通常目的是在该对象被不可撤销地丢弃之前执行清理操作。例如,表示输入/输出连接的对象的finalize方法可能会执行显式的l/0事务,以便在永久丢弃该对象之前断开连接
        object类的finalize方法不执行任何特殊操作;它只是正常返回。object的子类可以覆盖这个定义。
        Java程序设计语言不能保证哪个线程将调用任何给定对象的finalize方法。但是可以保证在finalize被调用时,调用finalize的线程不会持有任何用户可见的同步锁如果finalize方法抛出了一个未捕获的异常,该异常将被忽略,该对象的终结将终止。
        在为一个对象调用finalize方法之后,不会采取进一步的行动,直到Java虚拟机再次确定没有任何方法可以让任何尚未死亡的线程访问该对象,包括其他对象或类的可能操作,这些对象或类准备完成,在这一点上,对象可能会被丢弃
        对于任何给定的对象,Java虚拟机都不会多次调用finalize方法,finalize方法抛出的任何异常都会导致该对象的终止,但在其他情况下会被忽略。

参考:java.lang.object.java

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值