JDK源码阅读----java.lang.Object1.??private?static?native?void?registerNatives()????static?{???????
JDK源码阅读----java.lang.Object
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_IHashCode2.
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什么都不做。