所有的java类都是基于Object类的。可以说,Object类是java的起点。
我们会通过这样的方式来创建一个java对象:
Object object = new Object();
在这个过程中,发生了什么呢?我们知道,实例化一个对象的过程中,除了构造方法,静态代码块也会被执行。打开Object类远吗,会发现Object类并没有构造方法,但是有一个静态代码块:
private static native void registerNatives();
static {
registerNatives();
}
所以,我们在new 一个Object独享的时候,真正执行的代码其实是registerNatives()方法?它又是做什么的呢?首先,registerNatives()方法并没有具体的实现。仔细观察,还可以发现,它被native关键字修饰了。这和我们通常意义上的java方法就不一样了。那native关键字又是干什么的呢?带着这两个疑问,我们先来看看360百科对native关键字的定义:
所以,明白了吧?被native关键字修饰的方法,都是其他语言实现的。比如,registerNatives()方法会在创建一个对象时,做一些系统相关的东西。通读Object类源码,你会发现到处都是native模式。
以下是所有Object对外提供的方法(还有clone()和finalize()方法):
其中,getclass()、hashCode()、notify()、notifyAll()、clone()、wait(long timeout)方法,都是native方法。其他方法的代码如下:
public boolean equals(Object obj) {
return (this == obj);
}
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public final void wait() throws InterruptedException {
wait(0);
}
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);
}