最近开始系统记录Java的源码解析
第一天主要总结Object的源码
之前也看过Object的源码实现,但是没有系统整理。
Object类概述
该类是所有类的父类,所以其中的方法相当重要,我们先看下该类其中的主要方法与变量。
Object类中所有方法有
- getClass()
- hashCode()
- equals(Object obj)
- clone()
- toString()
- notify()
- notifyAll()
- wait()
- wait(long timeoutMillis)
- wait(long timeoutMillis, int nanos)
- finalize()
构造方法
Object类只有一个构造方法
@HotSpotIntrinsicCandidate
public Object() {}
其中我们可以看到该方法被HotSpotIntrinsicCandidate注解修饰。
HotSpotIntrinsicCandidate注解是Java9中新加入的新特性,代表着该方法有一个自己的内置实现,所以效率会快很多。
较为重要的方法
其中比较重要的方法有:
- toString()
- getClass()
- equals()
- clone()
Tips:在java 9中finalize()方法已经过时,因为该方法本身机制存在问题
toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
该方法返回一个字符串,该字符串由
getClass().getName()(类名) + “@”(@标记符)+ 该对象的哈希码的无符号十六进制表示组成。
该方法用的较多,某些子类会将其重写。
getClass()
@HotSpotIntrinsicCandidate
public final native Class<?> getClass();
我们可以看到,getClass()方法是由 final 修饰的方法,代表该方法不可被重写。
同时它也被是 @HotSpotIntrinsicCandidate 注解修饰的方法,也有相关的内置实现文件。
native代表调用其他语言的接口。
返回Object的运行时类的类型。
equals()
public boolean equals(Object obj) {
return (this == obj);
}
Object中的equals对象,仅仅只碰到是否指向同一块内存对象。
一般很多子类都会重写该方法。
clone()
@HotSpotIntrinsicCandidate
protected native Object clone() throws CloneNotSupportedException;
我们可以发现,该方法的修饰符有点不同,它是一个 protected 修饰的方法,实现了对象的浅复制,相当于创建副本,只有实现了 Cloneable 接口才可以调用该方法,否者会抛出 CloneNotSupportedException 异常。
主要是因为 Java 中除了8种基本类型参数是值传递以外,其他的类传递参数都是引用传递,这个时候需要传递副本。
其他方法
其他的方法,也比较重要
hashCode()
@HotSpotIntrinsicCandidate
public native int hashCode();
也是有自带的内置文件的方法。
该方法是返回该对象的哈希值,重写equals方法之后也要重写hashCode方法
wait()
wait方法主要有三个重载实现
wait()
public final void wait() throws InterruptedException {
wait(0L);
}
wait() 方法的作用是将当前对象所在的线程等待对象的锁,wait()方法是一直等待直到获得锁或者被中断。
wait(long timeout)
public final native void wait(long timeoutMillis) throws InterruptedException;
wait(long timeout) 是等待timeout时间,如果规定时间内还未获得锁则返回。
wait(long timeout,int naos)
public final void wait(long timeoutMillis, int nanos) throws InterruptedException {
if (timeoutMillis < 0) {
throw new IllegalArgumentException("timeoutMillis value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0 && timeoutMillis < Long.MAX_VALUE) {
timeoutMillis++;
}
wait(timeoutMillis);
}
该方法 timeoutMillis 相当于是要等待的最长时间(毫秒为单位),而 nanos 是一个额外的时间(以微毫秒为单位)。
notify与notifyAll
notify
@HotSpotIntrinsicCandidate
public final native void notify();
唤醒该对象下等待的某个线程。
notifyAll
@HotSpotIntrinsicCandidate
public final native void notifyAll();
唤醒该对象下等待的所有线程。