源码阅读笔记1————从Object开始

来源:互联网 发布:法国交友软件 编辑:程序博客网 时间:2024/06/06 23:55

源码阅读笔记一————从Object开始

一.前言

经过一个暑假对java的学习和零零散散的练习以及一些小项目。感觉对于java的掌握还是有些薄弱,有些地方不是很清晰,加上对java的源码的好奇,和在学长建议下,我决定阅读源码和API文档结合起来了解,来加深对java的了解,尽量做到对知其然以及知其所以然。首先从Object开始。

二.Object的概述

  1. 类OBject是所以类层次的根类,即所有类的父类
  2. 所在包:java.lang
  3. 构造方法:Object() 无参构造

三. native修饰符

在阅读过程中,发现一个陌生的修饰符,然后经过查看资料,得到以下信息
* 简单而言,native所修饰的方法,其对应实现不在当前文件,而是在其他语言(如c/c++)所实现的文件中。

四.源码和方法

public class Object {    /*一个本地方法,具体实现是用c(c++)在DLL中*/    private static native void registerNatives();    /*静态代码块,在Object类初始化是加载*/    static {        registerNatives();    }    /*返回次Object的运行类。返回的class对象是由所表示类的static synchronized方法锁定的对象    /*具体实现也不再Object中     */    public final native Class<?> getClass();    /*返回该对象的哈希码值。支持此方法是为了提高哈希表的性能     *hashCode的常规协定是:     *      1.在java应用程序执行期间,在堆同一对象多次调用hashCode方法时,必须一致的返回相同的整数,前提是将对象的     *          进行equls比较是所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无须保持一致     *      2.如果根据equls(Object)方法,两个对象是相等的,那么对这两个对象的每个对象调用hashCodre方法都必须生成形同的整数结果     *      3.如果根据equals(java.long.Object)方法,两个对象不相等,那么对这两个对象中的任意一个对象调用hashCode方法     *          不一定要求一定生成不同的整数结果     * /    public native int hashCode();    /*作用:比较两个对象是否相等     *可以清楚的看出来。在Object中,equals就是=     * 注意:1.当此方法被重写时,通常有必要重写 hashCode 方法,     *      以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。     *       2.重写时,注意要满足,自反性,对称性,传递性,一致性,对于任何非空引用都要返回false     */    public boolean equals(java.lang.Object obj) {        return (this == obj);    }    /*作用:创建并返回此对象的一个副本。副本的准确含义可能依赖对象的类    *抛出CloneNotSupportedException - 如果对象的类不支持 Cloneable 接口,    *       则重写 clone 方法的子类也会抛出此异常,以指示无法复制某个实例。    * */    protected native java.lang.Object clone() throws CloneNotSupportedException;    /*作用:返回该对象的字符串    *在Object中返回的字符串为:类名+@+该对象的哈希值    * 直接打印一个对象,其实相当于调用该方法    * */    public String toString() {        return getClass().getName() + "@" + Integer.toHexString(hashCode());    }    /*作用:唤醒此对象监视器上等待的单个线程。如果所有线程都在此线程等待,则会选择唤醒其中一个线程,选择是任意的。*/    public final native void notify();    /*作用:唤醒此对象监视器上等待的所有线程*/    public final native void notifyAll();    /*作用:在其他方法调用此对象的notify()方法或者notifyAll()方法前,或者超过指定的时间量前,导致当前线程等待    *参数: timeout 要等待的最长时间(以毫秒为单位)。    *抛出:IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。    *       InterruptedException - 如果在当前线程等待通知之前或者正在等待通知时,    *       任何线程中断了当前线程。在抛出此异常时,当前线程的中断状态 被清除。    * */    public final native void wait(long timeout) throws InterruptedException;    /*作用:在其他线程调用此对象的 notify() 方法或 notifyAll() 方法,    *        或者其他某个线程中断当前线程,或者已超过某个实际时间量前,导致当前线程等待。    *参数:timeout - 要等待的最长时间(以毫秒为单位)。    *        nanos - 额外时间(以毫微秒为单位,范围是 0-999999    * 抛出:IllegalArgumentException - 如果超时值是负数,或者毫微秒值不在 0-999999 范围内。    *       IllegalMonitorStateException - 如果当前线程不是此对象监视器的所有者。    *       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);    }    /*作用:在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待    *很明显在Object中 wait() = wait(0)    * */    public final void wait() throws InterruptedException {        wait(0);    }    /*作用:当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。    * */    protected void finalize() throws Throwable { }}