JDK源码阅读 - Object类

Posted magicTan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK源码阅读 - Object类相关的知识,希望对你有一定的参考价值。

概述

Object是所有类的基类,属于java.lang包。

构造方法

只有编译器提供的默认构造方法。

字段

Object类中没有成员字段。

方法

Object类一共12个方法。

Object类Structure

按照访问等级分:

  • public: getClass()、hashCode()、equals(Object obj)、toString()、notify()、notifyAll()、wait(long timeout)、wait(long timeout, int nanos)、wait()

  • protected: clone()、finalize()

  • private: registerNatives()

按照是否为final分:

  • final:getClass()、notify()、notifyAll()、wait(long timeout)、wait(long timeout, int nanos)、wait()

  • 非final:registerNatives()、hashCode()、equals(Object obj)、clone()、toString()、finalize()

按照是否为native分:

  • native:registerNatives()、getClass()、hashCode()、clone()、notify()、notifyAll()、wait(long timeout)

  • 非native:equals(Object obj)、toString()、wait(long timeout, int nanos)、wait()、finalize()

Object类方法详解

registerNatives()方法

1    private static native void registerNatives();
2    static {
3        registerNatives();
4    }

在初始化调用static代码块时调用,用于注册Object类中的静态方法。

getClass()方法

1    public final native Class<?> getClass();

返回类对象的Class实例,synchronized静态代码块时锁定的正是Class实例对象。

hashCode()、equals(Object obj)方法

1public native int hashCode();
2
3
4public boolean equals(Object obj) {
5    return (this == obj);
6}

Java规范中对hashCode、equals方法有如下规范:

  1. hashCode相等,equals不一定为true

  2. equal方法为true,hashCode一定相等

  3. hashCode不想等,equals一定不为true

  4. equals方法为false,hashCode可能相等

重写equals(Object obj)方法时必须同时重写hashCode()方法

clone()方法

1protected native Object clone() throws CloneNotSupportedException;
  • 用于对java对象进行复制,可分为深复制和浅复制。

  • 如果对象未实现Colneable接口,会抛出CloneNotSupportedException异常

toString()方法

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

默认实现为Class名+"@"+十六进制的hashCode

多线程相关notify()、notifyAll()、wait(long timeout)、wait(long timeout, int nanos)、wait()方法

 1public final native void notify();
2
3
4public final native void notifyAll();
5
6
7public final native void wait(long timeout) throws InterruptedException;
8
9
10public final void wait(long timeout, int nanos) throws InterruptedException {
11    if (timeout < 0) {
12        throw new IllegalArgumentException("timeout value is negative");
13    }
14
15
16    if (nanos < 0 || nanos > 999999) {
17        throw new IllegalArgumentException(
18                            "nanosecond timeout value out of range");
19    }
20
21
22    if (nanos > 0) {
23        timeout++;
24    }
25
26
27    wait(timeout);
28}
29
30
31public final void wait() throws InterruptedException {
32    wait(0);
33}
  • notify():唤醒一个正在等待这个对象的monitor线程,如果有多个线程在等待,只能唤醒其中一个

  • notifyAll():唤醒所有在等待这个对象的monitor线程

  • wait(long timeout):将当前持有此对象锁的线程进入等待状态,直到线程被notify()、notifyAll()、Thread.interrupts()方法唤醒或者超时。

    • 如果timeout为0,则会一直等待,直到被另外唤醒

  • wait(long timeout, int nanos):与wait(long timeout)类似,但添加了一个nanos参数以提供更细粒度的等待时间控制

  • wait():默认当前持有对象锁的线程进入等待状态并一直等待直到被notify()、notifyAll()、Thread.interrupts()方法唤醒

finalize()方法

1protected void finalize() throws Throwable { }

在GC回收对象实例时会被调用,因GC是不确定且随机的,无法确定此方法的执行时间(如果内存充足,GC永远都不会发生则finalize()方法一直都不会被调用)。


以上是关于JDK源码阅读 - Object类的主要内容,如果未能解决你的问题,请参考以下文章

JDK源码阅读开始--Object类

JDK源码阅读:Object源码分析

1.2JDK源码阅读之Object

JDK源码阅读:Object源码分析

JDK源码阅读之java.lang.Object(第二章)

jdk源码阅读之-1.1.Object·1