Object

Object类是所有类的父类(包括数组),所有对象(包括数组)都实现了这个类的方法,Object类中共有12个方法

Object类中有5个方法可以被子类覆盖

  • hashCode()
  • equals(Object obj)
  • clone()
  • toString()
  • finalize()。

Object有6个final的方法,基本逻辑都是由本地方法实现,不可以被子类重写

  • getClass()
  • notify()
  • notifyAll()
  • wait(long timeout)
  • wait(long timeout, int nanos)
  • wait()
public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }
    public native int hashCode();

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

    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    
    protected native Object clone() throws CloneNotSupportedException;
      
    protected void finalize() throws Throwable { }
            
    public final native Class<?> getClass();
    
    public final native void notify();
  
    public final native void notifyAll();
  
    public final native void wait(long timeout) throws InterruptedException;
    
    public final void wait() throws InterruptedException {
        wait(0);
    }

  
    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 native int hashCode();
返回一个对象的哈希值,主要服务于HashMap的hash tables。

hash值需要遵守的约定:

  • 一致性(consistent),在程序的一次执行过程中,对同一个对象必须一致地返回同一个整数。

  • 如果两个对象通过equals(Object)比较,结果相等,那么对这两个对象分别调用hashCode方法应该产生相同的整数结果。

  • 如果两个对象通过java.lang.Object.equals(java.lang.Ojbect)比较,结果不相等,不必保证对这两个对象分别调用hashCode也返回两个不相同的整数。虽然如此,但是如果2个对象不相等,那么返回不同的哈希值有助于哈希表的存储。典型实现是把一个对象的地址转换成整数。

public boolean equals(Object obj)

指示其他某个对象是否与此对象“相等”

equals 方法在非空对象引用上实现相等关系:

  • 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
  • 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
  • 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
  • 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
  • 对于任何非空引用值 x,x.equals(null) 都应返回 false。
  • Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

public String toString()

返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + '@' + Integer.toHexString(hashCode())

protected native Object clone() throws CloneNotSupportedException

创建并返回这个对象的副本,根据约定,这个方法应该调用super.clone()

  • 根据约定,拷贝的对象应该是独立于当前对象的(也就是说当前对象的修改,不应该影响到拷贝的对象),对于复杂的结构,需要对内部引用的对象也拷贝一次。也就是说默认实现是浅拷贝的,深拷贝需要自己做处理。
  • 如果想调用clone方法,需要这个类实现Cloneable接口,否则抛出java.lang.CloneNotSupportedException异常。
    所有的数组默认实现了 Cloneable接口。

protected void finalize() throws Throwable

当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。子类重写 finalize 方法,以配置系统资源或执行其他清除。

finalize 的常规协定是:当 JavaTM 虚拟机已确定尚未终止的任何线程无法再通过任何方法访问此对象时,将调用此方法,除非由于准备终止的其他某个对象或类的终结操作执行了某个操作。finalize 方法可以采取任何操作,其中包括再次使此对象对其他线程可用;不过,finalize 的主要目的是在不可撤消地丢弃对象之前执行清除操作。例如,表示输入/输出连接的对象的 finalize 方法可执行显式 I/O 事务,以便在永久丢弃对象之前中断连接。

Object 类的 finalize 方法执行非特殊性操作;它仅执行一些常规返回。Object 的子类可以重写此定义。

Java 编程语言不保证哪个线程将调用某个给定对象的 finalize 方法。但可以保证在调用 finalize 时,调用 finalize 的线程将不会持有任何用户可见的同步锁定。如果 finalize 方法抛出未捕获的异常,那么该异常将被忽略,并且该对象的终结操作将终止。

在启用某个对象的 finalize 方法后,将不会执行进一步操作,直到 Java 虚拟机再次确定尚未终止的任何线程无法再通过任何方法访问此对象,其中包括由准备终止的其他对象或类执行的可能操作,在执行该操作时,对象可能被丢弃。

对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。 finalize 方法抛出的任何异常都会导致此对象的终结操作停止,但可以通过其他方法忽略它。

public final native void notify()

唤醒等待在这个对象的监视器上的一个线程,如果很多线程在等待,那么其中一个会被唤醒,具体哪个线程被唤醒取决于具体实现。
(一个线程调用某个对象的wait方法后,会在这个对象的监视器上等待。)
一个对象应该先持有这个对象的监视器(执行对象的同步方法或者同步块;对于Class对象,执行静态同步方法),然后才能调用这个方法。

如果当前线程没有持有指定对象的锁,却调用了notify方法,会抛出IllegalMonitorStateException异常。

public final native void wait(long timeout) throws InterruptedException

当前线程阻塞指定时间,直到时间到了,或者被其它线程notify。这个方法会释放它持有的所有的锁。wait(0)的话,就会一直wait,直到被notify。调用这个方法的前提是当前线程必须持有这个对象的minotor。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值