Object(超类),是类层次结构的根。所有类都把Object作为超类。所有对象都实现类了该类的方法。Java1.0起始版本都定义了该类。
方法:
Object clone();对象的复制copy
Class<?> getClass(); 返回实例对象所属类的信息。
boolean equals(); 判断非空对象是否相等。
对于非空的对象X、Y、Z,存在4个特性:
自反性,X.equals(X),返回true,自己跟自己比较,自反性;
对称性,X.equals(Y)与Y.equals(X)返回结果同时为true;
传递性,X.equals(Y) 返回true,Y.equals(Z)返回true时,X.equals(Z)也返回true;
一致性,对象信息没有修改的情况下,多次调用equals()方法返回结果相同;
任何非空对象与null判断是否相等,都返回false。
此方法重写时,必须重写hashcode方法;hashcode方法协定要求,对象判断相等,必须hashcode相等。
int hashCode();返回哈希编码
返回对象的哈希码值,该方法是为了提高哈希表的性能。哈希码的协定:java应用程序运行期间,对同一个对象多次调用hashCode方法时,必须一致地返回相同的整数,前提是将对象进行equals比较时所有的信息没有被修改。对象equals方法比较相等,那么hash值一定相等。若比较不相等,那么hash值不一定不相等,但是为了提高性能,编码的时候不相等的对象,哈希码最好不要相等。Object类定义的hashCode确实针对不通的对象返回不同的哈希值。
void finalize();垃圾回收器确定对象不在有任何引用时(不可达),由对象的垃圾回收器调用此方法。在不可撤销丢弃对象之前,执行清除操作。
String toString();返回该对象的字符串表示。结果应该是一个建议明了的信息表达,建议所有子类重写此方法。
void wait();final修饰的方法不能被重写。在除当前线程外的其他线程调用notify()
/notifyAll()
方法前,让当前线程等待。当前现场必须拥有 此对象的监视器。与wati(0)、wait(0,0)相等。
void wait(long timeout);final修饰的方法不能被重写。按毫秒时间等待
void wait(long timeout, int nanos);final修饰的方法不能被重写。增加纳秒级别的等待精度,也是就是毫秒时间加1;1毫秒等于1000000纳秒,所以传入的纳秒值不能大于999999。
监视器:jvm对每个对象和Class都设置了一个监听器,发现和检测并发代码的冲入。当线程访问受保护的对象数据时,先要获取对象监视器的所有权,然后才能获取对象数据。所有因为获取监视器所有权等待的线程和当前线程,通过CPU调度竞争上岗获取所有权。然后执行受保护的代码,执行完毕后释放Monitor所有权。如果有线程持有对象监视器的所有权,那么其他线程等待(进入等待entry-set)。当一个线程获取对象监视器所有权之后,经过代码执行没有达到条件要求,那么需要调用Object的wait方法,线程会释放对象监视器的所有权,进入等待线程队列(wait-set),等待Object的notify方法唤醒,然后和其他线程通过CPU竞争获取对象监视器所有权。
void notify();final修饰的方法不能被重写。唤醒在此对象监视器上的等待线程(因为某种条件或原因,调用wait,然后释放了监视器所有权的线程)(1个),如果有很多等待的线程,随机唤醒一个。被唤醒的线程继续参加对象监视器所有权竞争。
void notify();final修饰的方法不能被重写。唤醒在此对象监视器上所有等待的线程。
package java.lang;
public class Object {
private static native void registerNatives();
static {
registerNatives();
}
/**
* 返回对象所属类的信息。类名称、类方法、变量等
*/
public final native Class<?> getClass();
/**
* 生成对象的哈希码值,equals相同的对象,有相同的哈希码;不相同的对象,尽量有不相同的哈希码
*/
public native int hashCode();
/**
* 判断非空对象是否相等
*/
public boolean equals(Object obj) {
return (this == obj);
}
/**
* 创建对象的副本并返回这个副本
*/
protected native Object clone() throws CloneNotSupportedException;
/**
* 返回对象的简明的描述字符串
*/
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
/**
* 唤醒在此对象监视器上等待线程的随机一个。
*/
public final native void notify();
/**
* 唤醒在此对象监视器上所有等待的线程。
*/
public final native void notifyAll();
/**
* 等待一定量的时间,如果timeout是0,不考虑超时时间
* 解除等待的方法:notify(),唤醒的包含当前线程;notifyAll()唤醒所有线程;其他线程中断指定
* 线程;到达等待的时间。
*/
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");
}
//自动加1
if (nanos > 0) {
timeout++;
}
wait(timeout);
}
/**
* 获得对象监视器所有权的当前线程等待
*/
public final void wait() throws InterruptedException {
wait(0);
}
/**
* 撤回丢弃对象前的清楚工作
*/
protected void finalize() throws Throwable { }
}