Java是纯面向对象的语言,换言之,在Java中一切都是对象。而Object类是Java中所有类的基类,也就是说所有类都直接或间接继承自Object。

​ 在继承体系中,父类是基础,子类是对父类的扩充和丰富,所以理解Object类对理解其他类至关重要。理解Object类,关键在于其实现的方法。

1.getClass()

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

​ 返回对象的Class对象,可以看出是个native方法。

2.hashCode()

1
public native int hashCode();

​ 返回对象的hashcode值,也是个native方法,

3.equals()

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

​ 判断对象是否相同,注意这里判断的是引用

4.clone()

1
protected native Object clone() throws CloneNotSupportedException;

​ 返回该对象的克隆。

5.toString()

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

​ 返回对象的字符串表示。

6.wait()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public final native void wait(long timeout) throws InterruptedException;
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);
}
public final void wait() throws InterruptedException {
wait(0);
}

​ 与synchronized配合使用,释放锁使线程等待。

7.notify() notifyAll()

1
2
public final native void notify();
public final native void notifyAll();

​ 唤醒等待的线程。

8.finalize()

1
protected void finalize() throws Throwable { }

​ 当对象没有有效引用时被垃圾回收器调用,但不保证一定会被调用。

对象回收过程中的finalize():

  • 通过可达性分析找到可以回收的对象
  • 将对象加入到一个较低优先级的线程(垃圾回收器线程),线程会依次调用对象的finalize()方法
  • 该线程执行了对象的finalize方法,若对象在该方法中实现了自救,对象不在回收
  • 对象的finalize方法还未来得及执行(线程的优先级较低),对象被回收