Object类 是类层次结构的根类。
Object类是所有类的超类。所有对象(包括数组)都实现这个类的方法。
所以需要了解Object类的所有方法:
1.hashCode()
1 | public int hashCode(); |
返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
不同对象的 hashCode() 的值一般是不相同。但是,同一个对象的hashCode() 值肯定相同。
2.getClass()
1 | public final Class getClass() |
返回此 Object 的运行时类。
2.1.getName()
可以通过 Class 类中的一个方法,获取对象的真实类的全名称。
1 | Object obj = new Object(); |
3.toString()
getClass().getName() + “@” + Integer.toHexString(hashCode()) 这返回的是:类的全路径名称+它的哈希码值在实际的开发中对我们来说是没有意义的所以我们一般会重写该方法
1 | public String toString() { |
4.equals()
1 | public boolean equals(Object obj) { |
默认方法是比较的是对象的引用是否相同。由于比较对象的引用对于我们在实际开发中没有意义,一般还是要重写该方法。 一般来说基础类型用==,比较引用数据类型使用equals
5.wait()
1 | /* 使当前线程等待,直到另一个线程为此对象调用notify()方法或notifyAll()方法,或者经过了指定的时间。 |
5.1-notify()
1 | /*唤醒正在此对象的监视器上等待的单个线程。 |
5.2-notifyAll()
1 | /* 唤醒正在此对象的监视器上等待的所有线程。 线程通过调用其中一个wait方法在对象的监视器上wait 。 |
6.finalize()
finalize()是Object中的方法,当垃圾回收器将要回收对象所占内存之前被调用,即当一个对象被虚拟机宣告死亡时会先调用它finalize()方法,让此对象处理它生前的最后事情(这个对象可以趁这个时机挣脱死亡的命运)。
1 | /* 当垃圾回收确定不再有对该对象的引用时,由垃圾回收器在对象上调用。 子类覆盖finalize方法以处置系统资源或执行其他清除。 |
下面是引申出的一些问题
为什么 wait,notify 和 notifyAll 是在 Object 类中定义的而不是在 Thread 类中定义?
wait 和 notify 不仅仅是普通方法或同步工具,更重要的是它们是 Java 中两个线程之间的通信机制。对语言设计者而言, 如果不能通过 Java 关键字(例如 synchronized)实现通信此机制,同时又要确保这个机制对每个对象可用, 那么 Object 类则是的正确声明位置。记住同步和等待通知是两个不同的领域,不要把它们看成是相同的或相关的。同步是提供互斥并确保 Java 类的线程安全,而 wait 和 notify 是两个线程之间的通信机制。
每个对象都可上锁,这是在 Object 类而不是 Thread 类中声明 wait 和 notify 的另一个原因。
在 Java 中为了进入代码的临界区,线程需要锁定并等待锁定,他们不知道哪些线程持有锁,而只是知道锁被某个线程持有, 并且他们应该等待取得锁, 而不是去了解哪个线程在同步块内,并请求它们释放锁定。
Java 是基于 Hoare 的监视器的思想,在Java中,所有对象都有一个监视器。
线程在监视器上等待,为执行等待,我们需要2个参数:
一个线程
一个监视器(任何对象)
在 Java 设计中,线程不能被指定,它总是运行当前代码的线程。但是,我们可以指定监视器(这是我们称之为等待的对象)。这是一个很好的设计,因为如果我们可以让任何其他线程在所需的监视器上等待,这将导致“入侵”,导致在设计并发程序时会遇到困难。请记住,在 Java 中,所有在另一个线程的执行中侵入的操作都被弃用了(例如 stop 方法)。