JDK源码阅读(1):Object类

所有的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);
}

猜你喜欢

转载自blog.csdn.net/qq_28802119/article/details/88989616