java.lang.Object,Object是Java所有类的祖先类(父类)
1.首先看object源码 JDK1.7(oracle):
public class Object {
//本地方法,C/C++在DLL中实现,通过JNI调用
private static native void registerNatives();
//类初始化调用此方法
static {
registerNatives();
}
//返回此Object的运行时类(每个类的Class类对象)
public final native Class<?> getClass();
//获得该对象的hash值
public native int hashCode();
//对比两对象的内存地址,如果不重写,equals方法比较的是对象地址
public boolean equals(Object obj) {
return (this == obj);
}
//本地clone方法,用于对象的赋值
protected native Object clone() throws CloneNotSupportedException;
//返回对象的的字符串表示,默认是:类名+@+hash值
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
//notify()/notifyAll()/wait()以及wait两个重载方法都是线程同步相关方法
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 {
}
可见object中拥有native,hashCode,euqals,clone,toString,wait,notify,notifyAll,finalize这几个方法,其中常用的方法有
equals,toString,以及线程中常常调用的wait,notify,notyfiAll方法。
另外:
源码中并没有Object的构造方法,但是,同样的,编译器在编译期间会给Object(事实上,所有的Java类,只要类中没有
构造方法,编译器都会默认的给一个空构造方法,若已有构造方法,则不会添加)一个默认的空的构造方法
带有native修饰的都是本地方法,所谓的本地方法是不通过Java语言实现的方法,但可以通过JNI,像调用Java方法一样调用
这些方法。详细的可以搜索查看JNI。 这个方法的作用是对Object以下几个本地方法(hashCode/clone/notify等)进行注册
(可以理解为,这个方法是告诉JVM这几个本地方法的实现映射),每一个有本地方法的都会有这个方法,但其内容不一样
(因为注册的方法不一样嘛)。