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 { }
}