Object浅析 - 969251639/study GitHub Wiki
Object类是java的所有类的基类,里面定义的方法也是每个java类都包含,很有必要分析这些方法的作用及含义。
下面是JDK1.8的Object类的源码
package java.lang;
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object obj) {
return (this == obj);
}
protected native Object clone() throws CloneNotSupportedException;
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public final native void notify();
public final native void notifyAll();
public final native void wait(long timeout) throws 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 >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
}
wait(timeout);
}
public final void wait() throws InterruptedException {
wait(0);
}
protected void finalize() throws Throwable { }
}
接下来主要看最常用的那几个方法:
getClass()
该方法是一个native类,由java虚拟机内部实现,用于获取一个java类的Class对象,所有的java类在编译后都会变成Class后由java虚拟机加载,所以每个java类都会有获取Class对象的方法。
hashCode()
该方法是一个native类,由java虚拟机内部实现,用于获取一个java类的哈希值,可以看做是地址的映射,一般计算出来都是串数字(该方法主要用于hash容器中,所以如果作为key的话,需要考虑重写该方法,最典型的一个重写就是String类,因为只要字符串内容相同,哪怕两个字符串类的地址不同,那么映射出来的hashcode也需要一致,所以String重写了该方法)
equals()
该方法主要用于比较两个类是否相等,很明显如果不重写该方法,默认比较的就是两个类的地址引用是否相同
clone()
该方法是一个native类,由java虚拟机内部实现,用于克隆一个相同的类出来(这里的克隆拷贝是浅拷贝,另外这个方法是protected修饰,需要继承Cloneable接口并重写clone实现)
toString()
该方法用于将类转成字符串,默认是输出类的classname + @ + 十六进制的hashcode,一般需要输出类信息的话都会重写该方法
notify,notifyAll,wait这几个方法主要用于线程通讯相关