Java与C++不同,Java不支持多继承,是一种单根继承结构语言。也就是说,Java中所有的类都有一个共同的祖先,这个祖先就是Object类。
Object类是一个特殊的类,是所有类的父类,如果一个类没有用extends明确指出继承与某个类,那么它默认继承Object类。下边我们通过Object类中的方法来了解Object类。
Object类的结构
如图可知,Object类有12个成员方法,按照用途可以分为以下几种:
- 构造函数
- hashCode和equals函数用来判断对象是否相等
- 线程相关的wait(),wait(long int),notify(),notifyAll()
- toString()和getClass
- clone()
- finalize()用于垃圾回收
Object类中方法的作用
(1)clone()方法
一个protected方法,能够实现对象的浅复制。只有实现了Cloneable接口才可以调用该方法,否则会抛出CloneNotSupportedException异常
(2)getClass()方法
一个final方法,用于获得运行时类的类型。
(3)toString()方法
返回一个String对象,用来标识自己,该方法比较常用,一般子类都有通过重写进行覆盖。
(4)finalize()方法
该方法用于释放资源,因为无法确定该方法什么时候被调用,因此很少使用。
(5)equals()方法
该方法非常重要且经常被使用。equals()方法时用来比较两个对象,但要区别equals和==,==是直接比较两个对象的地址。一般子类都会重写equals方法,如果两个Object进行比较,则equals()方法和==没有区别(源码就是直接使用==来实现equals()方法)。
(6)hashCode()方法
该方法主要用于哈希查找,这个方法在一些具有哈希功能的Collection中会用到,例如HashMap,HashSet等。在哈希查找中,是通过查询hashCode返回的值进行查找,在查找过程中不可避免会用到equals方法进行判断,因此在开发过程中,重写了equals()方法一般都要重写hashCode()方法。
(7)wait方法
wait方法就是使当前线程等待该对象的锁,当前线程必须是该对象的拥有者,也就是具有该对象的锁。wait方法一直等待,一直等到获得锁或者被中断。wait(long timeout)设定了一个超时间隔,如果
在规定时间内没有获得锁就返回。
调用该方法后当前线程进入睡眠状态,直到以下事件发生。
- 其他线程调用了该对象的 notify 方法。
- 其他线程调用了该对象的 notifyAll 方法。
- 其他线程调用了 interrupt 中断该线程。
- 时间间隔到了。
此时该线程就可以被调度了,如果是被中断的话就抛出一个InterruptedException 异常。
(8)notify和notifyAll
这两个方法都是用于唤醒线程,只是notify是唤醒等待的某个线程,而notifyAll是唤醒等待的所有线程。