Object类源码学习

文章详细解读了JDK1.8中Object类的基本方法,包括getClass()、hashCode()、equals()、clone()、toString()、notify()、notifyAll()、wait()系列方法以及finalize()和registerNatives()。这些方法为所有Java类提供了基础功能,如对象的哈希码、比较、复制、线程同步等。
摘要由CSDN通过智能技术生成

基于JDK1.8阅读源码

一、关于Object类

Object类是Java中所有类的根类,它位于java.lang包中。每个类都直接或间接地继承自Object类,因此Object类提供了一些基本的方法和功能,可以在所有对象中使用。

由于所有类都直接或间接地继承自Object类,因此可以在任何类中使用Object类的方法。子类可以选择性地重写Object类的方法,以满足自身的需求。

二、源码阅读

进入Object源码就可以看到Object提供了以下的方法,没有成员变量
在这里插入图片描述
Object类是Java中所有类的根类,它提供了一些基本的方法和功能。下面我们将逐个解析Object类的以下方法:

1. getClass()

public final native Class<?> getClass();

getClass()方法返回对象的运行时类。它是一个final方法,不能被子类重写。该方法通过本地方法调用获取对象的实际类,返回一个Class对象,该对象包含了有关类的信息,如类名、父类、接口等。

2. hashCode()

public native int hashCode();

hashCode()方法返回对象的哈希码。哈希码是一个整数值,用于快速查找对象在哈希表中的位置。

Object类中的hashCode()方法是一个本地方法,它的具体实现由底层的JVM提供。默认情况下,hashCode()方法返回对象的内存地址的哈希码。

3. equals(Object obj)

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

equals()方法用于比较两个对象是否相等。默认情况下,equals()方法比较的是对象的引用,即判断两个对象是否指向同一个内存地址。

Object类中的equals()方法实现非常简单,直接比较两个对象的引用是否相等。如果需要比较对象的内容,可以在子类中重写equals()方法。

4. clone()

protected native Object clone() throws CloneNotSupportedException;

clone()方法用于创建并返回对象的副本。它是一个受保护的方法,需要在子类中实现Cloneable接口才能调用。

Object类中的clone()方法是一个本地方法,它的具体实现由底层的JVM提供。

默认情况下,clone()方法执行的是浅拷贝,即只复制对象的引用。如果需要实现深拷贝,可以在子类中重写clone()方法。

5. toString()

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

toString()方法用于将对象转换为字符串表示。默认情况下,toString()方法返回对象的类名和内存地址的字符串表示。

Object类中的toString()方法实现将类名和哈希码拼接成一个字符串返回。

6. notify()

public final native void notify();

notify()方法用于唤醒在该对象上等待的单个线程。

它是一个final方法,不能被子类重写。该方法是一个本地方法,它的具体实现由底层的JVM提供。

7. notifyAll()

public final native void notifyAll();

notifyAll()方法用于唤醒在该对象上等待的所有线程。

它是一个final方法,不能被子类重写。该方法是一个本地方法,它的具体实现由底层的JVM提供。

8. wait()

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

wait()方法使当前线程进入等待状态,直到其他线程调用该对象的notify()或notifyAll()方法唤醒它。

wait()方法是一个final方法,不能被子类重写。默认情况下,wait()方法会一直等待,直到被唤醒或被中断。

9. wait(long timeout)

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

wait(timeout)方法使当前线程进入等待状态,最多等待指定的时间(以毫秒为单位),直到其他线程调用该对象的notify()或notifyAll()方法唤醒它,或者超过指定的等待时间。

wait(timeout)方法是一个final方法,不能被子类重写。

10. wait(long timeout, int nanos)

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

在上面的代码中,是Object类中的wait(long timeout, int nanos)方法的具体实现。该方法用于使当前线程进入等待状态,最多等待指定的时间(以毫秒为单位)加上指定的纳秒数,直到其他线程调用该对象的notify()或notifyAll()方法唤醒它,或者超过指定的等待时间。

首先,代码检查timeout和nanos的值是否合法。如果timeout小于0,则抛出IllegalArgumentException异常,提示超时值为负数。如果nanos小于0或大于999999(纳秒的范围为0-999999),则抛出IllegalArgumentException异常,提示纳秒超时值超出范围。

接下来,如果nanos大于0,表示纳秒超时值不为0,那么将timeout加1,以确保等待的时间稍微超过指定的时间。这是因为在Java中,线程的等待时间是以毫秒为单位的,而纳秒是更细粒度的时间单位。通过将timeout加1,可以确保等待的时间稍微超过指定的时间。

最后,调用wait(timeout)方法,将当前线程置于等待状态。如果其他线程在指定的时间内调用了该对象的notify()或notifyAll()方法,或者超过了指定的等待时间,当前线程将被唤醒并继续执行。

这是Object类中wait(long timeout, int nanos)方法的具体实现。通过使用该方法,可以实现线程间的同步和协作。

11. finalize()

protected void finalize() throws Throwable { }

finalize()方法是Java垃圾回收机制中的一个方法,用于在对象被垃圾回收之前执行清理操作。Object类中的finalize()方法是一个受保护的方法,可以在子类中重写。一般情况下,不建议在代码中直接使用finalize()方法,而是使用try-finally块来确保资源的释放。

12.registerNatives()

除此之外,源代码中还包含了registerNatives()方法的声明和静态代码块的调用。

public class Object {
    private static native void registerNatives();

    static {
        registerNatives();
    }
}

在这段代码中,registerNatives()方法被声明为私有的本地方法,用于注册本地方法。

静态代码块static {...}在类加载时执行,并且只会执行一次。在这个静态代码块中,我们调用了registerNatives()方法,以确保在Object类加载时,本地方法得到正确的注册。

通过这段代码,Object类可以使用本地方法来实现一些底层的操作,以提供更高的灵活性和功能性。这些本地方法的具体实现通常是在其他语言(如C或C++)中完成的,通过Java的本地接口(JNI)与Java代码进行交互。

需要注意的是,由于registerNatives()方法是一个本地方法,它的具体实现是在本地代码中完成的,而不是在Java源代码中。因此,无法直接查看registerNatives()方法的具体实现代码。它的具体实现可能因不同的Java虚拟机(JVM)实现而有所不同。

以上是JDK 1.8中Object类的方法解析及相应的源码。这些方法提供了一些基本的功能,如对象的比较、复制、转换等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

abcccccccccccccccode

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值