Java源码初窥--Object

     众所周知,java里面所有的类都是继承与Object这个类的,那么Object到底是一个什么类呢,今天我小心翼翼的窥探了一下他的奥秘

总体看来,Object里面主要包括下面一个方法

  

     不知道有没有细心的朋友发现,虽然是有一个构造方法,但是在源码中我们并没有看见呢?那他去哪儿呢,我也不知道,我猜测也许这个方法被java开发者隐藏起来了,或者是用其他语言实现的。不过这只是一个猜测,如果有知道的朋友,希望可以告知一下。(好像不写构造函数就应该是默认的构造函数吧)


     其次呢,它里面很多方法(如registerNatives,hashCode,clone等)都是带有关键字Native的,这个native到底又是干什么了的?其实呀native关键表明这个方法不是由java实现的,大多数情况下,操作系统都是MS的,所以你懂的,这种方法一般是用C,或者C++实现的,关于这个东西呢,有个东西叫JNIJava Native Interface的缩写,有兴趣的朋友可以去了解一下。


     然后我们再来看看他没个方法是怎么实现的:


1.registerNatives()


     这个方法我就不多说了,关于它的写法,以及为什么这么写,在JNI里面有很明确的说法。


2.getclass()


     这个方法呢,是获取当前的Class对象包括类名啊,域啊,什么的。具体实现?有没有大神能够给一个源码。我也想知道真相。


3.hashCode()


这个方法是返回当前对象的hash值,在很多情况下我们需要复写,具体呢,就是在我们的对象有自己的逻辑时需要复写,他一般都是和equals
方法一起复写的。因为当我们复写的时候equals方法是需要比较hash值的.什么是哈希值?哈希值是什么,我也不知道,去了解下数据结构吧。

 

4.equals()


     这个方法呢,上面英文注释也说了,用在当前对象非null的情况下,和另外一个对象比较是否是同一个对象,比较的应该是两个对象在内存中的地址,

很多类都复写Object的这个方法,比如说String类,它不仅比较内存地址,还比较了char[]。


5.clone()


     这个方法是复制一个当前对象,复制呢,有分为深克隆和浅克隆,具体的区别在于浅克隆克隆时是克隆的内存地址,还是实际的值,引用数据类型会克隆

内存地址。具体请参照相关文献。


6.tostring()


public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }

     这个方法具体我就不多说了,Object的tostring就是返回了类名@hash值,这个方法,我们再编写代码的时候一定注意要复写这个方法,因为Object的

这个方法 不是万能的,我们应该有自己的toString方法。


7.notify()、notifyAll()、wait()、wait(long)、wait(long,int)

     
     这几个方法是在线程同步时用的,唤醒单个,唤醒全部线程,等待方法有三个,一个不带参数,其他两个里面参数都是等待时间,但也可以由其他线程显式的唤醒。


8.finalize()


这个方法是有JVM在GC(垃圾回收)时调用的,java技术允许使用 finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作。这个方法是由垃圾收
集器在确定这个对象没有被引用时对这个对象调用的。子类覆盖 finalize() 方法以整理系统资源或者执行其他清理工作。finalize()方法是在垃圾收集器删除对象之
前对这个对象调用的。


     以上只是我个人的初窥理解,如有不正之处,还请前辈指正.小弟感激不尽。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值