Object类分析
Obejct类是所有类的父类,所有的类都继承与它,定义时不需要显示继承,JAVA类默认继承与Obejct。
位于JDK自带的rt.jar包中的java.lang包。
Object类中定义了一些方法,实际开发中常常会调用或者对部分方法进行重写,方法如下:
1、hashCode():
hashCode是jdk根据对象的地址或者字符串或者数字等,按照一定的算法,算出来的int类型的数值。主要应用于集合中,实现集合的快速查询等操作。
该方法返回该对象的hash值,为int类型,同一个对象的hashCode在不同时期调用,计算的结果要求保持一致。
实际应用中,该方法常常被重写。
2、equals():
用于比较两个对象是否相同,默认比较的是引用地址是否相同。在Object类中该方法于“==”效果相同,都是比较内存中的引用地址,官方建议,每个类都重写equals()方法。
注意:引用类型数据比较的是引用,即内存地址,基本数据类型比较的是值。返回值为boolean类型。
Obejct中代码如下:
public boolean equals(Object obj) {
return (this == obj);
}
重写equals()方法,以Integer类为例,代码如下:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
实际应用中,该方法常常被重写。
3、toString():
返回对象的字符串表达形式,返回类型很明显就是String。
Obejct中该方法返回类型和hashCode地址值,代码如下:
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
实际应用中,该方法常常被重写。
4、clone():
该方法用于对象的克隆,创建一个新的对象。
注意:clone()方法创建的对象为浅表复制,新创建的对象与原始对象引用地址相同,也就是说,新创建的对象与原始对象是同一个,当一个对象修改时,另一个对象也会随着修改。
clone()方法返回会抛出CloneNotSupportedException异常,调用时需要进行处理。
5、notify():
该方法用于唤醒被这个对象的monitor标记等待的线程,如果线程的数量大于1,那么被唤醒的线程是由VM自行决定的。注意被唤醒的线程不一定立即执行,至少要等待当前调用notify的线程释放这个对象的monitor,或者等待其他正好同步锁定该对象的线程释放了该对象。 当然了,也不是任何地方都可以调用notify的,调用的地方必须持有对象的monitor,可以有以下几种情况:1.在一个同步( synchronized)方法中;2.在一段该对象的同步代码块中;3.如果这个变量是类变量(static),同步的静态方法也持有。
6、notifyAll():
该方法与notify()方法功能相似,只是该方法唤醒全部线程,但是唤醒的线程不是立即执行。
7、wait():
通知当前线程挂起,当对象的notify或者notifyAll被调用的时候才会被重新唤醒,wait了的thread是可以被中断(interrupt)的。当线程wait的时候,这个线程其实丢失了对象的monitor,当被notify的时候,会在程序执行前重新请求到对象的monitor。
wait()方法另有两个重载方法wait(long timeout)和wait(long timeout, int nanos),wait()方法默认timeout为0,表示没有超时时间。timeout时间不能小于0,否则会报IllegalArgumentException异常;当timeout大于0,表示指明了该线程wait等待的时间,如果这个时间段内该线程没有被唤醒,那么时间到了以后,该线程也会自动唤醒。
代码如下:
public final void wait() throws InterruptedException {
wait(0);
}
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);
}
8、finalize():
垃圾回收器在回收某一个对象之前,会先调用该方法,做扫尾操作,当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
此方法一般不需要我们调用。
9、getClass():
返回当前对象的真实类型。