首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

JDK源码翻阅-java.lang.Object

2012-09-07 
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什么都不做。

热点排行