Java Object源码解析

最近开始系统记录Java的源码解析
第一天主要总结Object的源码
之前也看过Object的源码实现,但是没有系统整理。

Object类概述

该类是所有类的父类,所以其中的方法相当重要,我们先看下该类其中的主要方法与变量。
Object类中所有方法有

  • getClass()
  • hashCode()
  • equals(Object obj)
  • clone()
  • toString()
  • notify()
  • notifyAll()
  • wait()
  • wait(long timeoutMillis)
  • wait(long timeoutMillis, int nanos)
  • finalize()

构造方法

Object类只有一个构造方法

@HotSpotIntrinsicCandidate
    public Object() {}

其中我们可以看到该方法被HotSpotIntrinsicCandidate注解修饰。
HotSpotIntrinsicCandidate注解是Java9中新加入的新特性,代表着该方法有一个自己的内置实现,所以效率会快很多。

较为重要的方法

其中比较重要的方法有:

  1. toString()
  2. getClass()
  3. equals()
  4. clone()

Tips:在java 9中finalize()方法已经过时,因为该方法本身机制存在问题

toString()

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

该方法返回一个字符串,该字符串由

getClass().getName()(类名) + “@”(@标记符)+ 该对象的哈希码的无符号十六进制表示组成。

该方法用的较多,某些子类会将其重写。

getClass()

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

我们可以看到,getClass()方法是由 final 修饰的方法,代表该方法不可被重写。
同时它也被是 @HotSpotIntrinsicCandidate 注解修饰的方法,也有相关的内置实现文件。
native代表调用其他语言的接口。
返回Object的运行时类的类型。

equals()

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

Object中的equals对象,仅仅只碰到是否指向同一块内存对象。
一般很多子类都会重写该方法。

clone()

@HotSpotIntrinsicCandidate
    protected native Object clone() throws CloneNotSupportedException;

我们可以发现,该方法的修饰符有点不同,它是一个 protected 修饰的方法,实现了对象的浅复制,相当于创建副本,只有实现了 Cloneable 接口才可以调用该方法,否者会抛出 CloneNotSupportedException 异常。
主要是因为 Java 中除了8种基本类型参数是值传递以外,其他的类传递参数都是引用传递,这个时候需要传递副本。

其他方法

其他的方法,也比较重要

hashCode()

@HotSpotIntrinsicCandidate
    public native int hashCode();

也是有自带的内置文件的方法。
该方法是返回该对象的哈希值,重写equals方法之后也要重写hashCode方法

wait()

wait方法主要有三个重载实现

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

wait() 方法的作用是将当前对象所在的线程等待对象的锁,wait()方法是一直等待直到获得锁或者被中断。

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

wait(long timeout) 是等待timeout时间,如果规定时间内还未获得锁则返回。

wait(long timeout,int naos)
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);
    }

该方法 timeoutMillis 相当于是要等待的最长时间(毫秒为单位),而 nanos 是一个额外的时间(以微毫秒为单位)。

notify与notifyAll

notify
@HotSpotIntrinsicCandidate
    public final native void notify();

唤醒该对象下等待的某个线程。

notifyAll
@HotSpotIntrinsicCandidate
    public final native void notifyAll();

唤醒该对象下等待的所有线程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值