Java之Object源码解析总结

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()没有对锁释放.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值