源码阅读笔记一————从Object开始
一.前言
经过一个暑假对java的学习和零零散散的练习以及一些小项目。感觉对于java的掌握还是有些薄弱,有些地方不是很清晰,加上对java的源码的好奇,和在学长建议下,我决定阅读源码和API文档结合起来了解,来加深对java的了解,尽量做到对知其然以及知其所以然。首先从Object开始。
二.Object的概述
- 类OBject是所以类层次的根类,即所有类的父类
- 所在包:java.lang
- 构造方法: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 { }
}