JDK源码解析-java.lang.object

1.registerNatives()

   private static native void registerNatives();
    static {
        registerNatives();
    }
  • 首先这是个本地方法,是由其他语言编写的,运行中的Java程序调用本地方法时,虚拟机装载包含这个本地方法的动态库,并调用这个方法。本地方法是联系Java程序和底层主机操作系统的连接方法。
  • registerNatives本质上就是一个本地方法,但这又是一个有别于一般本地方法的本地方法,从方法名我们可以猜测该方法应该是用来注册本地方法的。当包含registerNatives()方法的类被加载的时候,注册的方法就是该类所包含的除了registerNatives()方法以外的所有本地方法。
  • 从源码可看出,先声明了静态本地方法,当类被加载时调用静态代码块中的方法,注册本地方法。

2.getClass()

public final native Class<?> getClass();

返回对象运行时的类对象

3.hashCode()

public native int hashCode();

为了支持hash表提供的方法,同一个方法多次调用该方法,返回同一个整数。如果2个对象equals方法相同,那么对象分别调用该方法返回的值也相同,反之,不一定。

4.equals(Object obj)

    public boolean equals(Object obj) {
        return (this == obj);
    }
  • null.equals(null)=true;(非null).equals(null)=false
  • 自反性,对称性,传递性,一致性
  • 为保证:相等的对象必须具有相等的哈希值,重写该方法时需要重新hashCode()方法

5.clone()

protected native Object clone() throws CloneNotSupportedException;
  • 深拷贝对引用数据类型的成员变量的所有的对象都开辟了内存空间;而浅拷贝只是传递地址指向,新的对象并没有对引用数据类型创建内存空间。可以使用构造方法和clone方法进行浅拷贝,通过序列化方式进行深拷贝。
  • x.clone().getClass() == x.getClass()x.clone().equals(x) 这个值不一定是true或者false,假如类中包含了引用数据类型,没有对每个数据类型进行重新clone()方法,返回值就为false。
  • 重新该方法需要实现Cloneable接口,数组默认继承了该接口。

6.toString()

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

从方法体可看出返回了拼接好了的字符串

7.notify()

public final native void notify();

唤醒正在此对象的监视器上等待的单个线程。如果有任何线程在该对象上等待,则选择其中一个唤醒。该选择是任意的,并且在实现时自行决定。唤醒的线程将以通常的方式与可能正在主动竞争以在该对象上进行同步的任何其他线程竞争;被唤醒的线程在成为锁定该对象的下一个线程时没有任何可靠的特权或劣势。

public final native void notifyAll();

唤醒正在此对象的监视器上等待的全部线程

8.wait(long timeout)

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

方法导致当前线程将自身置于该对象的等待集合中,然后放弃对该对象的所有同步声明。线程出于线程调度目的而被禁用,并且处于休眠状态。等待应该总是循环执行

9.wait(long timeout, int nanos)

    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时长,进入等待状态

10.wait()

  public final void wait() throws InterruptedException {
        wait(0);
    }

进入等待状态知道被唤醒

11.finalize()

protected void finalize() throws Throwable { }

当垃圾回收确定不再有对该对象的引用时,由垃圾回收器在对象上调用。显式调用进行垃圾回收,比如用于I/O操作时。

参考资料:
1.https://blog.youkuaiyun.com/Saintyyu/article/details/90452826
2.https://www.cnblogs.com/shakinghead/p/7651502.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值