Object源码
所有的Java对象都拥有Object默认的方法。
Object中的方法:
- Object()
- registerNatives() : void
- getClass() : Class<?>
- hashCode() : int
- equals(Object) : boolean
- clone() : Object
- toString() : String
- notify() : void
- notifyAll() : void
- wait() : void
- wait(long) : void
- wait(long,int) : void
hashCode() 和 equals()的实现
@HotSpotIntrinsicCandidate
public native int hashCode();
public boolean equals(Object obj) {
return this == obj;
}
- 至于hashCode()是native方法底层实现了,就不管了。
native关键字标识的java方法为本地方法,底层是有c/c++编写的程序编译后dll文件,java加载dll文件后,可用通过本地方法调用dll中函数
- 默认的equals()方法是比较两个对象的地址是否相等。
不过一般在类中都会重写equals()和hashCode()两个方法
toString()的实现
public String toString() {
return this.getClass().getName() + "@" + Integer.toHexString(this.hashCode());
}
- 一般都会重载toString()方法的。
clone()的实现
@HotSpotIntrinsicCandidate
protected native Object clone() throws CloneNotSupportedException;
- 深拷贝指的是该对象的成员变量(如果是可变引用)都应该克隆一份
- 浅拷贝指的是成员变量没有被克隆一份
wait()与notify()方法
这几个不怎么好说,直接用问题理解吧
- 为什么wait和notify在Object方法上?
wait()和notify()是Java给我们提供线程之间通信的API,既然是线程的东西,那什么是在Object类上定义,而不是在Thread类上定义呢?
因为我们的锁是对象锁,每个对象都可以成为锁。让当前线程等待某个对象的锁,当然应该通过这个对象来操作了。
锁对象是任意的,所以这些方法必须定义在Object类中
- notify方法调用后,会发生什么?
notify会唤醒某个处于等待队列的线程,不过notify方法调用后,被唤醒的线程不会立马获得到锁对象。而是等待notify的synchronized代码块执行完之后才会获得锁对象
- sleep和wait有什么区别?
hread.sleep()与Object.wait()二者都可以暂停当前线程,释放CPU控制权。
主要的区别在于Object.wait()在释放CPU同时,释放了对象锁的控制。
而Thread.sleep()没有对锁释放.