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这几个方法主要用于线程通讯相关