1. private static native void registerNatives();
static {
registerNatives();
}
为使JVM能将java的本地方法与C中的具体实现相关联,C中方法的命名必须遵循一定规则,如java.lang.Object.registerNatives对应的C中的实现方法名应为java_lang_Object_registerNative,通过定义本地方法registerNatives,我们可以在C的实现代码中任意命名相对应的方法名,如hashcode在OpenJDK中C的实现为JVM_IHashCode
2.public final native Class<?> getClass();
该方法返回的是该对象运行时类的Class对象。对于每个被加载的类型,jvm都会为它创建一个java.lang.Class类的实例,在方法区中存储此类的类型信息和一个指向类实例的引用,该引用把这个实例和存储在方法区中的类型数据关联起来。因此get到的Class对象内包含的就是此类的类型信息。
3.public native int hashCode();
返回该对象的哈希值。支持此方法是为了提高哈希表的性能。但只有对象存储在HashSet,HashMap,HsahTable等以hash表为工作机制的容器的时候,才需要关心这个函数。
hashcode常规规范规定hashcode必须满足:对象相同则哈希值必定相同,但哈希值相同对象可以不同。其中的一种本地方法实现是将对象内存通过hash算法映射成hashcode,这样对象相同则哈希值必等,若出现不同对象的哈希值相等,就称为hash冲突。现在hashMap解决hash冲突使用了链表法(hashMap.get)。其他的还有开放地址法,再哈希法及公共溢出区法等等。
4. public boolean equals(Object obj) {
return (this == obj);
}
当此方法被重写时,通常有必要重写hashCode方法,以维护hashCode方法的常规协定,即相等对象必须具有相等的哈希码。
5.protected native Object clone() throws CloneNotSupportedException;
该方法用于对象的拷贝,它会把该对象在堆上所占内存空间拷贝一份形成一个新的对象。每个对象的堆上都存储有一个指向方法区中其类型信息的指针,而JVM通过这个指针来判断一个对象的类型,由于只是简单的将对象的空间进行复制,所以它们具有相同的类型,即obj.clone().getClass()==obj.getClass()。另外,若类具有引用类型的实例变量的话,也只是对这个引用进行拷贝,并不复制其引用的对象。所以拷贝对象的引用与原对象的指向相同的对象,即为“浅拷贝”。可通过循环拷贝,以实现拷贝对象和原对象不能相互影响的“深拷贝”。
该方法是protected,因而所有实现了Cloneable接口的java类可来调用该方法。
6. public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
返回一个由类名和此对象哈希值的无符号十六进制表示组成。
7.public final void wait() throws InterruptedException
public final native void wait(long timeout) throws InterruptedException
public final void wait(long timeout, int nanos) throws InterruptedException
在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。当前线程必须拥有此对象的对象锁,即wait()方法必须写在同步模块(synchronized)中。
public final native void notify();
public final native void notifyAll();
唤醒在此对象同步模块上等待的单个或所有线程。
8.protected void finalize() throws Throwable { }
用户可以自己调用对象的finalize方法,但是这种调用是正常的方法调用,和对象的销毁过程无关。而JVM保证在一个对象所占用的内存被回收之前,如果它实现了finalize方法,则该方法一定会被调用。Object的默认finalize什么都不做。