余腾

导航

Java源码分析一(Object)

目前大四、想学习一下Se的源码前几天读了不少今天开始整理一下最近学到的东西从一切的父类Object类开始整理

第一弹Object

Object类中定义的一些方法

Object类中的方法如下:
Object():构造方法。
registerNatives():装载本地库。
getClass():返回此 Object的运行时类。
hashCode():返回对象的哈希码值。
equals(Object):指示一些其他对象是否等于此。
clone():创建并返回此对象的副本。
toString():返回对象的字符串表示形式。
notify():唤醒正在等待对象监视器的单个线程。
notifyAll():唤醒正在等待对象监视器的所有线程。
wait(long):使当前线程等待,直到另一个线程调用 notify()方法或该对象的 notifyAll()方法,或者指定的时间已过。
wait(long, int):使当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法,或者指定的时间已过。
wait():使当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()方法。
finalize():当垃圾收集确定不再有对该对象的引用时,在对象上调用该方法。

 private static native void registerNatives();
 本方法在Object的static代码块中执行一次,目的将本类装在到本地库中,因为Object是所有类的父类,即所有的类都会在创建的时候自动装在到本地库中,代码调用如下
  static {
        registerNatives();
    }
  public final native Class<?> getClass();
  此方法也是native类型的作用通过反射将所属类的信息打印出来。
  public native int hashCode();
  此方法是通过特殊的计算规则计算一个对象的哈希值,此外一个对象在创建后在调用hashCode后经过计算算出hashCode 这个对象如果没有重写equals那么比较的就是地址值即使他的属性发生变化HashCode也不会变化。即hashCode是否变化只与该对象equals有关equals不变hashCode不变。
    public boolean equals(Object obj) {
        return (this == obj);
    }
  Object类的equlas比较的是两个对象地址值,如果你新建了一个对象没有重写equals方法默认是比较地址值,但是我们一般比较对象的具体数值如String 重写了他的equals方法主要判断两个字符串的内容是否相等而不是比较地址值,拿String举个例子 String重写的equals代码如下:
 public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }
   
    protected native Object clone() throws CloneNotSupportedException;
    此方法主要是复制一个新的对象存储起来,因为是protected的方法我没有试过
    public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
    }
    此方法主要是打印的时候用我们平时System.out.println(obj)的时候默认就是输出他的toString 而Object类他的toString方法是通过反射得到类名后+@+将hash值转换成16进制的
        public final native void notify();
    此方法是线程时用的,我们定义锁的时候会确定一个锁对象,即多个线程共用一把锁,此方法就是随机将一个wait()的线程(wait下面讲)唤醒重新加载到就绪状态等待执行。
    public final native void notifyAll();
    此方法是将本对象中所有wait()的线程唤醒加载到就绪状态。
    public final native void wait(long timeout) throws InterruptedException;
    接下来是wait 三部曲 首先说一下参数是long timeout时候 意思是将一个线程等待,并且释放锁就是不在进入线程就绪状态无法和别的线程抢锁了。这个timeout的值值得是你让他等待多长时间
等到timeout的时间过了他就又开始和其他线程抢锁了。此外当timeout如果等0将永远不进入就绪状态等待notify() notifyAll()的唤醒
  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);
    }
此方法在timeout的基础上加了一个nanos(纳秒)你可以理解成加了一秒到时候让timeout++就可以了
 public final void wait() throws InterruptedException {
        wait(0);
    }
此方法就是第一种的参数为0的情况意思是除了notify() notifyAll()他会一直等待下去
 protected void finalize() throws Throwable { }
此方法是Object的最后一个方法  C语言有一套垃圾回收机制 这个相当于手动将不要的东西给他当垃圾回收了,目前太菜了还没学Jvm等学了Jvm我到时候再补充
    




posted on 2021-09-10 16:16  余腾  阅读(54)  评论(0编辑  收藏  举报

Fork me on Gitee