Object
是所有类的基类,他有一些方法是我们经常用到的,比如 equals(Object obj)
, hashCode()
, 还有并发编程中用到的 notify()
, wait()
等。
定义一个类时,如果没有用 extends
去继承其他类,那么他会隐式地继承 Object
类,我们也可以显式地去继承 Object
类,这两种方式是一样的。
// 隐式
class MyClass {}
// 显式
class MyClass extends Object {}
Object
类中有一些方法是值得关注的,我们来看。
clone()
protected Object clone() throws CloneNotSupportedException
clone()
方法用于创建并返回一个对象的拷贝。值得注意的是,默认的 clone()
方法是浅拷贝,对于深拷贝,你可以在 clone()
方法中自己去实现。
equals(Object obj)
public boolean equals(Object obj)
默认的 Object.equlas()
方法是这样的:
public boolean equals(Object obj) {
return (this == obj);
}
我们先看一下这个 ==
符号:
- 对于基本类型,他比较的是值
- 对于引用类型,他比较的是对象的内存地址
所以在这个 equals()
方法中,比较的是两个对象的内存地址,即两个对象是否是同一个对象。
一般我们会重写 equals()
方法,比如判断两个对象的属性是否相同,相同则返回 true
,而不是判断是否是同一个对象。拿 String
类举例,他其实重写了 equals()
方法,用于判断两个字符串的值,而不是两个 String
对象的内存地址。
hashCode()
public int hashCode()
hashCode()
方法通常用在基于 hash 的集合类中,如 HashMap
,HashSet
等,他返回这个对象的哈希值。这个哈希值用于确定在基于 hash 的集合类中该对象的索引位置。
对两个不同的对象做哈希计算时,可能会出现计算出的哈希值相同的情况,也就是哈希碰撞。我们在重写 equals()
方法时也会重写 hashCode()
方法,以保证对象在哈希集合中能正常使用。
hashCode()
方法有一些规则:
- 在同一个 Java 程序中,对于同一个对象,无论调用多少次
hashCode()
方法,返回的哈希值必须相同 - 如果两个对象的
equals()
方法返回值为true
,那么它们的hashCode()
方法应该返回相同数值
更深入的内容我会在之后的文章里探讨。
toString()
public String toString()
他返回一个对象的字符串表示,默认是这样的:
public String toString() {
return getClass().getName() + '@' + Integer.toHexString(hashCode());
}
为了输出一个对象的属性信息,一般我们会重写这个方法。
getClass()
public final Class<?> getClass()
他返回对象的运行时类,在反射中用的较多。
finalize()
protected void finalize() throws Throwable
这个方法用于一个对象被 GC 回收时触发的操作。
wait(), wait(long timeout), wait(long timeout, int nanos)
public final void wait() throws InterruptedException
public final void wait(long timeout, int nanos) throws InterruptedException
public final void wait(long timeout) throws InterruptedException
让当前线程等待直到其他线程调用该对象的 notify()
或 notifyAll()
方法。
让当前线程等待,直到其他线程调用该对象的 notify()
或 notifyAll()
方法,或者是超过了参数设置的超时时间。
nanos
参数是以纳秒为单位的额外超时时间。
notify()
public final void notify()
唤醒一个在对象监视器上等待的线程,如果有多个线程在该对象上等待,会任意选择其中一个。
notifyAll()
public final void notifyAll()
唤醒所有在对象监视器上等待的线程。