Java之Object源码解析

Object类作为所有类层次的根源,有着非常重要的作用,每个类都让Object作为其超类,所有的对象包括数组,都实现了Object里面定义的方法,总之一句话,凡是有对象的地方就一定实现了Object类的方法

首先我们知道,Object类里有如下几种方法:

Class<?> getClass();  //返回当前Object的运行类

int hashCode(); //返回该对象的哈希值

boolea equals(Object obj); // 比较其它对象是否与此对象相等

protected Object clone();  //创建并返回此对象的一个副本

String toString();  //返回该对象的字符串表示

void notify();  //唤醒此对象监听器上等待的单个线程

void notifyAll(); //唤醒此对象监听器上等待的所有线程

void wait(long timeout);  //在其他线程调用此对象的notify()方法或notifyAll()方法时,或者超过限定的时间,导致当前线程等待

void wait(long timeout, int nanos);  //在其他线程调用此对象的notify()方法或notifyAll()方法时,或者超过限定时间,或者当前线程被其它某个线程中断时,导致当前线程等待

void wait();  ///在其他线程调用此对象的notify()方法或notifyAll()方法时,导致当前线程等待

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


Java.lang.Object源码

package java.lang;

public class Object {

    private static native void registerNatives();// 一个本地方法,具体实现由C或C++实现

    // 对象初始化时调用,且只调用一次
    static {
        registerNatives();
    }

    public final native Class<?> getClass();

    // 针对不同的对象返回不同的整数(一般通过将该对象的内部地址转换成一个整数来实现)
    public native int hashCode();

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

    protected native Object clone() throws CloneNotSupportedException;

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

    public final native void notify();

    public final native void notifyAll();

    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 >= 500000 || (nanos != 0 && timeout == 0)) {
            timeout++;
        }

        wait(timeout);
    }

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

    protected void finalize() throws Throwable {
    }
}

我们看到Object类里面的许多方法是用native修饰的,说明它是一个本地方法,是由非java代码实现的,值得一提的是Object类中的equals()方法和hashCode()方法,在我们比较两个对象是否相等时,都要用到这两个方法,比较两个对象是否相等,一是用equals方法比较两个对象的引用是否相等,即比较两个引用中存储的对象地址的这个值是否相等,然后用hashCode()方法比较它们的存储的地址(实际上是由hashCode返回的一个int类型的hash值来进行比较的)是否相等,如果引用相等,地址相等,那么这两个对象相等

jdk中的某些类重写了equals方法,使其可以直接比较两个对象是否相等,如集合中的某些类


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值