Java Object简介

  • java.lang.Object 在Java中被定义为一个顶级父类
  • 是Java所有类的父类,可以显示或隐式继承
  • 所有类默认继承Object类
  • 数组也继承Object类

Java Object类常用方法

1. private方法

  • registerNatives方法

code

1
2
3
4
5
private static native void registerNatives();
// 初始化时调用
static {
registerNatives();
}

说明:

native表明该方法的具体实现是由C/C++代码实现
该方法其主要作用是将C/C++中的方法映射到Java中的native方法,实现方法命名的解耦

2. protected方法

  • finalize方法

code

1
protected void finalize() throws Throwable { }

说明:

当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
GC清理对象之前所调用的清理方法,是回调方法,我们可以覆盖这个方法写一些清理的代码
GC会自动扫描没有引用的对象(即null)
可以通过System.runFinalization() 强制GC清理该对象调用finalze()方法
GC有时不会调用对象的finalize()方法(由JVM决定)
相当于c++中的析构函数
有待深层次的了解

  • clone方法

code

1
protected native Object clone() throws CloneNotSupportedException;

说明:

主要用于克隆当前对象,创建并返回此对象的一个副本
所有数组都被视为实现接口Cloneable
包含引用类型的,一般是浅克隆
深度克隆可以通过序列化和反序列化实现
有待深层次的了解:浅克隆和深度克隆

3. public 方法

  • 默认无参构造器

    1
    public Object(){} // 不显示声明在类中
  • hashCode方法

code

1
public native int hashCode();

说明:

返回该对象的哈希码值
hashCode的存在主要是用于查找的快捷性,如HashMap,Hashtable,主要是用在散列结构中确定对象的存储地址的;
如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并产生hashCode使用对象,一定要和equals方法使用的一致
两个对象相同,就是适用于equals(Java.lang.Object)方法,那么对象的hashCode一定要相同
两个对象的hashCode相同,并不一定表示两个对象相同,只能说明这两个对象在散列存储结构中
有待了解hasHCode如何实现

  • equals方法

code

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

说明:

指示某个其他对象是否与此对象“相等”
equals 方法在非空对象引用上实现相等关系:
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

  • toString方法

code

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

说明:

返回该对象的字符串表示
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成

  • notify方法

code

1
public final native void notify();

说明:

唤醒在此对象监视器上等待的单个线程。
如果所有线程都在此对象上等待,则会选择唤醒其中一个线程。选择是任意性的,并在对实现做出决定时发生。线程通过调用其中一个 wait 方法,在对象的监视器上等待。
直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。
此方法只应由作为此对象监视器的所有者的线程来调用。通过以下三种方法之一,线程可以成为此对象监视器的所有者:
通过执行此对象的同步 (Sychronized) 实例方法。
通过执行在此对象上进行同步的 synchronized 语句的正文。
对于 Class 类型的对象,可以通过执行该类的同步静态方法。
一次只能有一个线程拥有对象的监视器。
IllegalMonitorStateException - 如果当前的线程不是此对象监视器的所有者。
有待和并发编程结合在一起了解(notify, notifyAll,wait)

  • notifyAll方法

code

1
public final native void notifyAll();

唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个 wait 方法,在对象的监视器上等待。
直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程。被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争;例如,唤醒的线程在作为锁定此对象的下一个线程方面没有可靠的特权或劣势。
此方法只应由作为此对象监视器的所有者的线程来调用。请参阅 notify 方法,了解线程能够成为监视器所有者的方法的描述。
IllegalMonitorStateException - 如果当前的线程不是此对象监视器的所有者。

  • wait方法

code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// native
public final native void wait(long timeout) throws InterruptedException;

// 间接调用native wait
public final void wait() throws InterruptedException {
wait(0);
}
// wait(timeout,nanos) 间接调用natvie wait
public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
//nanos 单位为纳秒, 1毫秒 = 1000 微秒 = 1000 000 纳秒
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}

// nanos 大于 500000 即半毫秒 就timout 加1毫秒
// 特殊情况下: 如果timeout为0且nanos大于0,则timout加1毫秒
if (nanos >= 500000 || (nanos != 0 && timeout == 0)) {
timeout++;
}

wait(timeout);
}

说明:

导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量
timeout - 要等待的最长时间(以毫秒为单位)。
nanos - 额外时间(以毫微秒为单位,范围是 0-999999)

  • getClass方法

Code

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

说明:

返回一个对象的运行时类
这Class对象所表示的类的静态同步方法的对象被锁定。
有待和Class一起结合了解