Object源码解析

简介

Object 作为所有类的父类,如果一个类没有显式继承任何类,则会隐式继承 Object 类.

在该类中定义了在java世界中类的基本行为.

方法解析

  1. 注册本地方法

     private static native void registerNatives();
     static {
         registerNatives();
     }
    

    关于本地方法的介绍,会在后续文章介绍.

  2. 获得class对象

    public final native Class<?> getClass();
    
  3. 生成hashcode

    public native int hashCode();
    

    关于hashcode有如下的规约:

    • 在Java应用程序程序执行期间,对于同一对象多次调用hashCode()方法时,其返回的哈希码是相同的,前提是将对象进行equals比较时所用的标尺信息未做修改。在Java应用程序的一次执行到另外一次执行,同一对象的hashCode()返回的哈希码无须保持一致
    • 如果两个对象相等(依据:调用equals()方法),那么这两个对象调用hashCode()返回的哈希码也必须相等
    • 反之,两个对象调用hashCode()返回的哈希码相等,这两个对象不一定相等
  4. equals方法

    public boolean equals(Object obj) {
         return (this == obj);
     }
    

    关于equals方法,有如下规约:

    • 自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。

    • 对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。

    • 传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true

    • 一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。

    • 对于任何非空引用值 x,x.equals(null) 都应返回 false。

  5. clone方法

    protected native Object clone() throws CloneNotSupportedException;
    

    如果要调用 clone() 方法,该对象必须实现 Clonealbe 接口,不然会报 CloneNotSupportedException 异常.
    通过该方法会实现浅克隆

  6. toString方法

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

    该方法默认实现会打印出类名和hashcode值.

  7. notify方法

    public final native void notify();
    

    该方法会随机唤醒一个因为调用了当前对象的 wait 方法而陷入阻塞的线程.

  8. notifyAll方法

    public final native void notifyAll();
    

    唤醒全部因为调用了当前对象的 wait 方法而陷入阻塞的线程。

  9. wait方法

    public final native void wait(long timeout) throws InterruptedException;
    
    public final void wait(long timeout, int nanos) throws InterruptedException {
         if (timeout < 0) {
             throw new IllegalArgumentException("timeout value is negative");
         }
    
         if (nanos < 0 || nanos > 999999) {
             throw new IllegalArgumentException(
                                 "nanosecond timeout value out of range");
         }
    
         if (nanos > 0) {
             timeout++;
         }
    
         wait(timeout);
     }
     
     public final void wait() throws InterruptedException {
         wait(0);
     } 
    

    这个方法有三个重载的版本(其实终归调用的都是同一个方法),主要作用是使得当前线程让出所持有的对象锁并陷入阻塞状态,另外两个带有参数的版本可以控制线程的阻塞时间,阻塞时间达到了参数所指定的时间时就唤醒该线程。当然也可以在线程阻塞过程中通过这个对象的 notify / notifyAll 方法唤醒.
    关于wait/notify/notifyAll方法执行有如下要求:
    该方法只有获得该object监视器的线程才能调用,而一个线程获得object的监视器有如下3种方式:

    • 执行synchronized实例方法
    • 执行synchronized 代码块
    • 执行synchronized 静态方法
  10. finalize方法

    protected void finalize() throws Throwable { }
    

    该方法会在对象回收前调用,用于回收资源,由于该方法的一些弊端,如至多调用一次,调用时间不确定.因此,关于这个方法已不推荐使用.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值