Object源码解析
文章目录
0、写在正文前
用了几年Java,你是否去看过Object中的源码,是否知道其中方法各自的实现过程及用途呢,今天就一起来学习Object的源码吧~~~
1、带着问题看源码
- Object中有哪些方法?
- hashCode方法是不是本地方法?
- equals比较的是什么?怎么比较的?
- clone方法的作用?
- 讲一下toString方法?
- 讲一下wait方法?
- 讲一下notify、notifyAll方法?
2、Object中有哪些方法?
- hachCode
- equals
- clone
- toString
- notify
- notifyAll
- wait
- finalize
3、hashCode方法是不是本地方法?
看过源码的应该都知道是native方法
public native int hashCode();
4、equals比较的是什么?怎么比较的?
指示其他某个对象是否与此对象“相等”。
源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
5、clone方法的作用?
源码:
protected native Object clone() throws CloneNotSupportedException;
作用:
clone方法是用来复制一个对象。不同于“=”。
对于值类型的数据是可以通过“=”来实现复制的。但是对于引用类型的对象,“=”只能复制其内存地址,使对象的引用指向同一个对象,而不会创建新的对象。clone则可以创建与原来对象相同的对象。
看源码可知clone是一个native方法并且用protected修饰,所以我们不能直接调用object类的clone方法
使用方式:
- 实体类实现Cloneable接口
- 重写clone方法
例子:
TestClone obj = new TestClone();
//使用 clone 复制
Object objClone = obj.clone();
System.out.println(obj.toString());
System.out.println(objClone.toString());
System.out.println(obj == objClone);
//使用 = 复制
TestClone objObj = obj;
System.out.println(obj.toString());
System.out.println(objObj.toString());
System.out.println(obj == objObj);
测试结果:

6、讲一下toString方法?
源码:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
看源码得知调用tostring方法后输出一串字符串,类名+@+该对象hashcode的16进制字符串
7、讲一下wait方法
wait()的作用是让当前线程进入等待状态,同时,wait()也会让当前线程释放它所持有的锁。“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)
8、讲一下notify、notifyAll方法
notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。