Object类的学习笔记

package java.lang;

// 表明包名 表示该文件在java lang 包下

import jdk.internal.vm.annotation.IntrinsicCandidate;

//导入对应的注解

//自从JDK 1.0时候就产生 且是所有类的超类 也就是所有类的父类

public class Object {

//构造方法

    @IntrinsicCandidate

public Object() {}

//获取该对象

    @IntrinsicCandidate

public final native Class<?> getClass();

//这个方法就是获取该类的字节码对象 这个是个类型通配符 这个方法是一种 本地方法 意思就是这个方法的定义并不由java语言编写

    @IntrinsicCandidate

    public native int hashCode();

   //本地方法哈希值 也是一种本地方法 有很多地方需要用到哈希方法 比如运行时常量池中的串池 再挂载的时候就需要 对象的哈希值 来计算 因为串池本身是一种哈希表的链式

    public boolean equals(Object obj) {

        return (this == obj);

    }

//该方法 是对通一个类的两个对象的值进行比较 一般来说== 形式比的是完全相等强求引用对象必须相当 但是对应的equal方法并不强行要求他们属于同一个对象 有时候只要求值相等就好了   为什么会出现再重写equal方法的时候要求重写对应的hashcode方法 具体原因等去扒对应的HashSet 源码

    @IntrinsicCandidate

protected native Object clone() throws CloneNotSupportedException;

//该方法时克隆方法 也是本地方法 作用是利用克隆方法创建一个新的对象

    public String toString() {

        return getClass().getName() + "@" + Integer.toHexString(hashCode());  }

//该方法的作用时将该类的对象转化为String类的对象 对于System.out.printf() 这个方法的配合 大部分的子类都重写了这个方法  这个Object的toString方法 时类名加上这个类对象的哈希值作为参数调用 Integer 的toHexString 方法的返回值

    @IntrinsicCandidate

    public final native void notify();

   //这是一个本地方法 且不可以被重写 注意 该方法的具体作用是在于同步锁内部使用的

  使用后 在他执行完当前程序时候 就是交出同步锁的对象时 将唤醒一个正处于同步锁内部执行了wait方法的线程 首先这个时随机唤醒(虽然听说还是具有一定规律) 然后唤醒的线程获取同步锁的对象 然后执行代码

  

    @IntrinsicCandidate

    public final native void notifyAll();

唤醒等待此对象监视器的所有线程。线程通过调用其中一个等待方法在对象的监视器上等待。

在当前线程放弃此对象的锁定之前,被唤醒的线程将无法继续。唤醒的线程将以通常的方式与任何其他线程竞争,这些线程可能正在积极地竞争该对象上的同步;例如,被唤醒的线程在成为下一个锁定该对象的线程时没有可靠的特权或劣势。

此方法只能由作为此对象监视器所有者的线程调用。有关线程成为监视器所有者的方式的描述,请参见notify方法。  

   //上面是官方给的说明 

// 具体作用也是 当目前的线程执行到交出同步锁对象时候 将会唤醒所有线程在次同步锁内部失去同步锁对象的所有线程 由他们去争夺同步锁对象的所有权 然后执行程序

 public final void wait() throws InterruptedException {

        wait(0L);

    }

//这个方法也是final方法不允许重写 这个方法将会抛出一个异常 线程中断异常 如果线程执行了这个方法就会抛出这个异常 作用就是会导致当前执行这个方法的线程在同步锁内失去同步锁对象的所有权 然后被中断

    public final native void wait(long timeoutMillis) throws InterruptedException;

//这个方法 是wait方法的重载 也是本地方法 参数具有一定作用 若在对象锁中 没有人去唤醒 则会自动唤醒 然后进入就绪状态 抢到对象锁就开始执行 如果没有抢到唤醒也只能停滞代码执行 等待到获取同步锁的对象所有权

 

    public final void wait(long timeoutMillis, int nanos) throws InterruptedException {

        if (timeoutMillis < 0) {
            throw new IllegalArgumentException("timeoutMillis value is negative");
        }

        if (nanos < 0 || nanos > 999999) {

            throw new IllegalArgumentException(

                                "nanosecond timeout value out of range");
        }
        if (nanos > 0 && timeoutMillis < Long.MAX_VALUE) {

            timeoutMillis++;

        }
        wait(timeoutMillis);

}

//这个wait方法的重载版本 不知道其他特殊的意义(目前暂时未知) 多了一些异常操作 估计是加强wait方法等待时候的精度

  

  protected void finalize() throws Throwable { }

//来到object类的保护方法 这个方法在垃圾回收机制时是十分重要的 这个方法若被调用的时候 一定是该对象已经失去GCroot上的链条上掉落 可以被GC 也就是可以被收集器回收的时候 会被触发 JVM 会判断该对象是否重写了finalize方法 且是否是第一次调用 如果都满足 该对象不会被直接回收 他会加入一个优先级较低的线程中 等待该方法的执行 这个方法内部被执行的时候若被Gcroot对象重新引用 就会离开finalization线程队列 也是 会逃过GC 收集器  但是《深入理解JVM虚拟机》中指出这个方法他的优点不是用来挽回对象逃脱垃圾回收的 更多是做一种类似死前的处理操作 这样具有相关意义

作者水平有限 如果有错误的地方 可以在评论区指出 谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值