Java源码分析---Object类(JDK14)


更多JDK源码分析请点击,持续更新


Object类

  • Object 类是类层次结构的根,每个类都有 Object 类作为父类,所有对象,包括数组,都实现了 Object 类中的方法。

  • Object 类是唯一一个没有父类的类。

  • 可以使用 Object 类型的变量引用任何类型的对象。

概念:

static:static关键字修饰的方法(变量)称为静态方法(静态成员变量),静态方法只能访问静态成员。

native:native关键字修饰的方法为本地方法,通常由C、C++语言编写。

final:被final关键字修饰的方法,不可以被子类重写。被final修饰的类,不允许被继承。

registerNatives()

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

该方法被native修饰,说明该方法是本地方法。并且在静态代码块中被调用,说明在Object类加载的时候就会执行registerNatives方法。

该方法的主要作用为注册本地方法。

getClass()

返回此对象的运行时类。 返回的Class对象是被表示的类的静态同步方法锁定的对象。

@HotSpotIntrinsicCandidate
public final native Class<?> getClass();

该方法也是一个本地方法,同时被final修饰,表示不能被子类重写。该方法可以获取到类的定义信息,然后通过反射获取该类的成员变量和方法信息。也可以通过返回的Class对像调用该类的构造方法直接创建对象。

***@HotSpotIntrinsicCandidate*** 注释可以点此了解。

hashCode()

返回对象的哈希码值。

public native int hashCode();

该方法同样为本地方法,由于在Java应用程序执行期间,在同一个对象上多次调用它,返回的哈希码是一样的,所以该方法多用于***HashMap***、HashSet、***Hashtabel***等类中。

equals()

判断两个对象是否相等。

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

这里采用==判断两个对象是否相等,比较的是对象的地址引用,而不是对象的值。在 HashMap 中存储的的对象都需重写该方法。

equals()方法具有以下特性:

  1. 自反性:对于任何非空引用,x.equals(x)应该返回true

  2. 对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true

  3. 传递性:对于任何引用下x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,x.equals(z)也应该返回true

  4. 一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果

  5. 对于任意非空引用x,x.equals(null)应该返回false

clone()

创建并返回此对象的副本。

protected native Object clone() throws CloneNotSupportedException;

clone() 是一个本地方法,被protected关键字修饰,该方法只能在本类及其子类中调用(但是所有类都是Object类的子类,所以在任何类中都可以调用该方法)。要调用该方法还需要实现 Cloneable 接口,如果未实现该接口,就会抛出上面的 CloneNotSupportedException 异常。所有数组都被认为实现了 Cloneable 接口,并且数组类型T []的 clone 方法的返回类型为T [],其中T是任何引用或原始类型。否则,此方法将创建此对象类的新实例,并使用该对象相应字段的内容完全初始化其所有字段,就像通过赋值一样;字段的内容本身不会被克隆。因此,此方法执行此对象的“浅拷贝”,而不是“深拷贝”。

Object类本身并不实现Cloneable接口,因此在其类为Object的对象上调用clone方法将导致在运行时引发异常。

toString()

返回对象的字符串表示形式。 通常,toString 方法返回一个“以文本形式表示”此对象的字符串。 结果应该是简洁易懂的表示形式,便于人们阅读。 建议所有子类都重写此方法。
Object 类的 toString 方法返回一个字符串,该字符串包括该对象是其实例的类的名称,符号字符“ @”以及该对象的哈希码的无符号十六进制表示形式。

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

注意System.out.println(Object)输出对象的时候会调用对象的 toString 方法。

println(Object) 方法中会调用 String.valueOf(Object) 方法将对象转换为 String 类型

如果对象为null,返回”null“,否则 String.valueOf(Object) 方法会调用对象的 toString() 方法,

public void println(Object x) {
    String s = String.valueOf(x);
    synchronized (this) {
        print(s);
        newLine();
    }
}
public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toStr。ing();
}

notify()

唤醒正在此对象的监视器上等待的单个线程。如果有任何线程在该对象上等待,则选择其中一个唤醒。该选择是任意的,并且可以根据实现情况进行选择。线程通过调用 wait 方法在对象的监视器上等待。

public final native void notify();

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

此方法只能由作为该对象的监视器的所有者的线程调用。线程可以通过以下三种方式之一成为对象监视器的所有者:

  • 通过执行该对象的同步实例方法。
  • 通过执行在对象上同步的同步语句的主体。
  • 对于类类型的对象,通过执行该类的同步静态方法。

一次只能有一个线程拥有对象的监视器。

notifyAll()

唤醒正在此对象的监视器上等待的所有线程。

public final native void notifyAll();

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

wait()

使当前线程等待,直到被唤醒或唤醒为止。

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

wait 方法被 final 关键字修饰,不可以被子类重写。内部调用 wait(long) 方法,只是参数为0。

wait(long)

使当前线程等待,直到被唤醒为止,或者直到经过一定的时间 timeoutMills(毫秒)

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

该方法是本地方法,被 final 关键字修饰,不可以被子类重写。作用为让进程等待,直到调用了 notify 或者 notifyAll 方法或者到了指定的时间。

wait(long, int)

使当前线程等待,直到被唤醒为止,或者直到经过一定的时间 timeoutMills(毫秒)

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);
}

该方法被 final 关键字修饰,不可以被子类重写。内部还是调用 wait(long) 方法。参数 nanos 为纳秒,范围为(0,999999)。

如果 nanos 大于零,等待时间将增加1毫秒。

finalize()

当垃圾回收确定不再有对该对象的引用时,由垃圾回收器在对象上调用。用于在对象被回收前执行一些操作。

@Deprecated(since="9")
protected void finalize() throws Throwable { }

Object类的finalize方法不执行任何特殊操作;它只是正常返回。 Object的子类可以覆盖该方法。

注意:该方法上加上了注释 @Deprecated 表示该方法存在一定缺陷,不推荐使用该方法。当对象不可访问后,CleanerPhantomReference 提供了更灵活的有效的方式来释放资源。

如果有问题和不足,欢迎大家提出指正。

更多JDK源码分析请点击,持续更新

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值