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_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什么都不做。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值