欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Object类分析

程序员文章站 2022-04-21 21:12:56
...

Obejct类是所有类的父类,所有的类都继承与它,定义时不需要显示继承,JAVA类默认继承与Obejct。

位于JDK自带的rt.jar包中的java.lang包。

Object类中定义了一些方法,实际开发中常常会调用或者对部分方法进行重写,方法如下:

1、hashCode():

hashCode是jdk根据对象的地址或者字符串或者数字等,按照一定的算法,算出来的int类型的数值。主要应用于集合中,实现集合的快速查询等操作。

该方法返回该对象的hash值,为int类型,同一个对象的hashCode在不同时期调用,计算的结果要求保持一致。

实际应用中,该方法常常被重写。

2、equals():

用于比较两个对象是否相同,默认比较的是引用地址是否相同。在Object类中该方法于“==”效果相同,都是比较内存中的引用地址,官方建议,每个类都重写equals()方法。

注意:引用类型数据比较的是引用,即内存地址,基本数据类型比较的是值。返回值为boolean类型。
Obejct中代码如下:

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

重写equals()方法,以Integer类为例,代码如下:

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
}

实际应用中,该方法常常被重写。

3、toString():

返回对象的字符串表达形式,返回类型很明显就是String。

Obejct中该方法返回类型和hashCode地址值,代码如下:

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

实际应用中,该方法常常被重写。

4、clone():

该方法用于对象的克隆,创建一个新的对象。

注意:clone()方法创建的对象为浅表复制,新创建的对象与原始对象引用地址相同,也就是说,新创建的对象与原始对象是同一个,当一个对象修改时,另一个对象也会随着修改。

clone()方法返回会抛出CloneNotSupportedException异常,调用时需要进行处理。

5、notify():

该方法用于唤醒被这个对象的monitor标记等待的线程,如果线程的数量大于1,那么被唤醒的线程是由VM自行决定的。注意被唤醒的线程不一定立即执行,至少要等待当前调用notify的线程释放这个对象的monitor,或者等待其他正好同步锁定该对象的线程释放了该对象。 当然了,也不是任何地方都可以调用notify的,调用的地方必须持有对象的monitor,可以有以下几种情况:1.在一个同步( synchronized)方法中;2.在一段该对象的同步代码块中;3.如果这个变量是类变量(static),同步的静态方法也持有。

6、notifyAll():

该方法与notify()方法功能相似,只是该方法唤醒全部线程,但是唤醒的线程不是立即执行。

7、wait():

通知当前线程挂起,当对象的notify或者notifyAll被调用的时候才会被重新唤醒,wait了的thread是可以被中断(interrupt)的。当线程wait的时候,这个线程其实丢失了对象的monitor,当被notify的时候,会在程序执行前重新请求到对象的monitor。

wait()方法另有两个重载方法wait(long timeout)和wait(long timeout, int nanos),wait()方法默认timeout为0,表示没有超时时间。timeout时间不能小于0,否则会报IllegalArgumentException异常;当timeout大于0,表示指明了该线程wait等待的时间,如果这个时间段内该线程没有被唤醒,那么时间到了以后,该线程也会自动唤醒。

代码如下:

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

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

8、finalize():

垃圾回收器在回收某一个对象之前,会先调用该方法,做扫尾操作,当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。

此方法一般不需要我们调用。

9、getClass():

返回当前对象的真实类型。

相关标签: Object