java.lang.Object

java.lang.Object

package java.lang;

/**
 * Object类是Java中其他所有类的祖先,没有Object类Java面向对象无从谈起,
 * Object类位于java.lang包中,java.lang包包含着Java最基础和核心的类,
 * 在编译的时候会自动导入,Object类没有定义属性
 */
public class Object {

    private static native void registerNatives();
    static {
        registerNatives();
    }

    /**
     * getClass是一个本地方法,返回的是此Object对象的类对象/运行时类对象Class<?>。
     * 效果与Object.class相同
     */
    public final native Class<?> getClass();

    /**
     * 返回一个整形数值,表示该对象的哈希码值
     * hashCode()具有一些约定
     * 1)在Java应用程序程序执行期间,对于同一对象多次调用hashCode()方法时,
     * 其返回的哈希码是相同的,前提是将对象进行equals比较时所用的标尺信息未做修改。
     * 在Java应用程序的一次执行到另外一次执行,同一对象的hashCode()返回的哈希码
     * 无须保持一致;
     * 2)如果两个对象相等(依据:调用equals()方法),那么这两对象调用hashCode返回的
     * 哈希码必须相等 ===》 因此重写equals()方法必须重写hashCode()方法。
     * 3)反之,两个对象调用hashCode返回的哈希码相等,这两个对象不一定相等
     *
     * 既然比较两个对象是否相等的唯一条件是equals(),为什么需要hashCode()呢?
     * 这主要体现在hashCode()方法的作用上,其主要用于增强哈希表的性能。
     * 以集合类中,以Set为例,当新加一个对象时,需要判断现有集合中是否已经存在
     * 与此对象相等的对象,如果没有hashCode()方法,需要将Set进行一次遍历,
     * 并逐一用equals()方法判断两个对象是否相等,此种算法时间复杂度为o(n)。
     */
    public native int hashCode();

    /**
     * 注意:在Object中的equals方法比较的时地址,而String中是重写了该方法
     * equals()方法的理解:判断两个对象是否想等,但是我们又可以去重写这个判断的标准,
     * 如果不重写,那么就默认继承父类的equals()
     */
    public boolean equals(java.lang.Object obj) {
        return (this == obj);
    }

    /**
     * 目的是创建并返回此对象的一个副本,clone函数返回的是一个引用,
     * 指向的是新clone出来的对象,此新对象与原对象分别占用不同的堆空间
     * clone方法的正确调用需要实现Cloneable接口,如果没有实现该接口,并且子类
     * 直接调用Object类的clone()方法,则会抛出CloneNotSupportedException异常
     */
    protected native java.lang.Object clone() throws CloneNotSupportedException;

    /**
     * 当我们使用System.out.println(obj)时,其内部就是通过调用toString()方法来实现的
     */
    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 > 0) {
            timeout++;
        }
        wait(timeout);
    }
    public final void wait() throws InterruptedException {
        wait(0);
    }

    /**
     * 该方法主要与Java垃圾回收机制有关
     * Object中定义finalize方法表明Java中每一个对象都将具有finalize这种行为,
     * 其具体调用时机在:JVM准备对此对形象所占用的内存空间进行垃圾回收前,
     * 将被调用。由此可以看出,此方法并不是由我们主动去调用的
     * (虽然可以主动去调用,此时与其他自定义方法无异)。
     */
    protected void finalize() throws Throwable { }
}
posted @ 2019-03-03 15:51  刘丽刚  阅读(434)  评论(0)    收藏  举报