深入学习java源码——Object类


Object class源代码解析

当我们从jdk包中刚取出来看Object的源文件时,感觉文件内容好多哈,其实真正的代码没有多少,大多是注释,看下面我把注释全删了,看起来是不是更加直观了。

package java.lang;

public class Object {

    private static native void registerNatives();
    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 > 0) {
            timeout++;
        }

        wait(timeout);
    }
	
    public final void wait() throws InterruptedException {
        wait(0);
    }
	
    protected void finalize() throws Throwable { }
}


源代码通读

以下源码中涉及到的native方法底层均为c/c++语言实现,查看c/c++语言源码请访问
AndroidXRef网站 查看
1、registerNatives方法解析

//private static native修饰的方法表示私有的、本地必须实现的原生方法,
//所以我们java开发人员不必担心此类方法的实现,因为底层已经为我们用C语言实现。
private static native void registerNatives();
    static {//静态代码块表示类加载时执行此方法
        registerNatives();
}

2、getClass方法解析

//操作系统底层实现,且不被其他子类所覆盖
//getClass表示获取对象运行时的类定义信息
public final native Class<?> getClass();

3、hashCode方法解析

//返回对象的hashCode值
public native int hashCode();

4、equals方法解析

/**
 *比较两个对象是否相等,相等返回true,不相等返回false。
 *Object作为java中所有类的父类,其实此方法是有局限性的,我们大多时候需要重写该
 *方法来达到两个对象的比较;
 *我们知道所有的对象都拥有引用(内存地址)和状态(数据),同时“==”比较两个对象的的内
 *存地址,所以说使用Object的equals()方法是比较两个对象的内存地址是否相等,即若
 *object1.equals(object2)为true,则表示object1和object2实际上是引用同一个对象。
 *在JDK中,String、Math等封装类都对equals()方法进行了重写。
 */
public boolean equals(Object obj) {
        return (this == obj);
}
//被其他类重写后的equals方法,可以看到对象内容的比较
public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = count;
        if (n == anotherString.count) {
        char v1[] = value;
        char v2[] = anotherString.value;
        int i = offset;
        int j = anotherString.offset;
        while (n-- != 0) {
            if (v1[i++] != v2[j++])
            return false;
        }
        return true;
        }
    }
    return false;
}

5、clone方法解析

//复制对象方法,返回一个新的对象,在该对象的类无法实现 Cloneable 接口时,抛出该异常。
//重写 clone 方法的应用程序也可能抛出此异常,指示不能或不应复制一个对象。
//这里要注意与对象引用的赋值区分,如Object a1 = new Object(); Object a2 = a1; 其实还是同一个对象。
protected native Object clone() throws CloneNotSupportedException;

6、toString方法解析

/**
 *该方法这里返回  当前对象名@此对象哈希码的无符号十六进制表示形式。
 *Integer.toHexString(hashCode()) 以对象的哈希码为参数,以16进制无符号整数形式返回此哈希码的字符串
 *表示形式。一般在其他类中都会重写、重载此方法。
 */
public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

7、notify方法解析

//其API解释为 唤醒在此对象监视器上等待的单个线程。
//也就是在执行此方法时随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态。
public final native void notify();

8、notifyAll方法解析

//其API解释为 唤醒在此对象监视器上等待的所有线程。
public final native void notifyAll();

9、 wait方法解析

//在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
public final void wait() throws InterruptedException {
        wait(0);
}
//在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量timeout前,
//导致当前线程等待。
public final native void wait(long timeout) t	hrows InterruptedException;
//在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,
//或者已超过某个实际时间量timeout前,导致当前线程等待。
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);
}

10、finalize方法解析

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

学完啦,放松一下吧!

  • 笑话一:“我给你出个脑筋急转弯,你说达芬奇密码的上面是什么?”
    “这……太难了吧。不知道。”
    “笨!达芬奇密码的上面就是达芬奇帐号啊,那达芬奇密码的下面是什么?”“我……这……还是不知道。”“是达芬奇验证码”。

  • 笑话二:【程序员被提bug之后的反应】
    1.怎么可能;2.在我这是好的,不信你来看看;3.真是奇怪,刚刚还好好的;4.肯定是数据问题;5.你清下缓存试试;6.重启下电脑试试;7.你装的什么版本的类库(jdk)8.这谁写的代码;9.尼玛怎么还在用360安全浏览器;10.用户不会像你这么操作的。

  • 笑话三:客户被绑,蒙眼,惊问:“想干什么?”
    对方不语,鞭笞之,客户求饶:“别打,要钱?”
    又一鞭,“十万够不?”
    又一鞭,“一百万?”
    又一鞭。客户崩溃:“你们TMD到底要啥?”
    “要什么?我帮你做项目,写代码的时候也很想知道你TMD到底想要啥!”

  • 笑话四:程序猿跟产品经理一起看电视。每个节目看到一半程序猿就换台,看到一半就换台,几次之后产品经理终于忍无可忍的咆哮:老子刚看出点意思你就换、刚看出点意思你就换,到底还让不让人看啦?!
    程序猿淡定的盯着电视道:你半路改需求的时候我可没吱过声!

  • 笑话五:程序猿的情书
    亲爱的“对象”:
    我能抽象出整个世界,但是我不能抽象出你,因为你在我心中是那么的具体,所以我的世界并不完整。
    我可以重载甚至覆盖这个世界里的任何一种方法,但是我却不能重载对你的思念,也许命中注定了,你在我的世界里永远的烙上了静态的属性。
    而我不慎调用了爱你这个方法,当我义无返顾的把自己作为参数传进这个方法时,我才发现爱上你是一个死循环,它不停的返回对你的思念,记在我心里的堆栈,在这无尽的黑夜中,我的内存里已经再也装不下别人。
    我不停的向系统申请空间,但却捕获一个异常:我爱的人不爱我。
    为了解决这个异常,我愿意虚拟出最后一点内存,把所有我能实现的方法地址记入堆栈,并且在栈尾存入最后一个方法:将字符串“我爱你,你爱我吗?”传递给你。
    如果返回值为真,我将用尽一生去爱你,否则,我将释放掉所有系统资源。

猜你喜欢

转载自blog.csdn.net/qq_40672583/article/details/82691912