object类是类层次的根,每个类都有一个作为父类的Object。所有的对象,包含数组,实现了该类的方法。
final native Class<?> getClass();
返回该对象运行时的class,返回的Class对象是由代表类的static synchronized方法。实际的结果类型是Class<? extends |X|> ,|X|在getClass被调用后执行表达式的静态类型擦除,如:下代码段没有类型转换处理:
Number n = 0;
Class<? extends Number> c = n.getClass();
final natve int hashCode();
返回对象的hash code值,为支持hash tables的特性,如通过java.util.HashMap提供
通常hashCode定义是:
一个java应用程序执行期间,不论何时,不止一次的对同一对象的调用,hashCode方法必须始终返回相同的整数,在对象被修改没有提供相等比较信息。这个整数不需要保持一致,从一个应用到另一个相同的应用中。
如果根据equals方法比较2个对象相等,则分别调用2个对象的hashCode方法必须产生相同的整数结果。
如2个不相等的对象,则分别调用2个对象的hashCode方法产生不同的值。这点不是要求的,然而,程序员考虑为不同对象生成不同hashCode值可以提高hash tables的性能。
通过Object类定义hashCode方法为不同对象生成不同hashCode值,是合理可行的(通常是转换对象内部地址到一个整数,但这不是java语言实现的)
boolean equals(Object obj)
表明是否有其他对象”等于“该对象,该方法实现在一个non-null object引用的等价关系:
自反性:non-null引用的值x,x.equals(x)应该返回true
对称性:non-null引用的值x、y,当且仅当y.equals(x)为true,则x.equals(y)应该 为true;
传递性:non-null引用的值x、y、z,如果x.equals(y)为true,y.equals(z)为 true,则x.equals(z)应该为true;
一致性: non-null引用的值x、y ,多次调用x.equals(y)一致的返回true或false,在对象被修改没有提供相等比较信息;
任何non-null引用的值x,x.equals(null)应该返回false;
equals方法为Object实现了最有可能确定对象的等价关系。对于non-null引用的值x、y,当且仅当x和y引用同一个对象(x == y)时,则该方法返回true。注意,通常需要重写该方法,每次重写该方法时,保持通常hashCode定义方法,指出相等对象必须有相等的hashCode值
native Object clone();
创建并返回此对象的拷贝,拷贝的精度取决于该对象的类。总的意图是,对于任何对象x,这表达式:
x.clone() != x;//返回true
x.clone().getClass() == x.getClass();//将返回true,但这些不是绝对要求
然而,通常x.clone().equals(x) 返回true,但这些不是绝对要求。
通常约定,返回对象通过调用super.clone方法应该可获取的。如果一个类和它所有的超类(除Object)服从这个约定, x.clone().getClass() == x.getClass();//将返回true
通常约定,此方法返回的对象应该独立于该对象。为了实现这种独立性,可能需要在该方法返回它之前修改一个or多个返回对象的字段,这意味着,copy任何可变对象(包括内部的”深层结构“)被克隆对象的副本替换对这些对象的引用。如果一个类仅包含原始字段or引用不可变的对象,此时通过clone返回的对象没有字段需要修改。
若对象的class没有实现Cloneable接口,则抛出CloneNotSupportedException。注意所有的数组被认为是实现了Cloneable接口并且clone方法返回一个数组类型T[],T为任何引用或原始类型。否则,这个方法创建一个该对象类的一个新实例,并初始化所有该对象相关的字段内容,如分配,字段内容没有自己克隆,因此,该方法执行了该对象的”shallow copy“,不是”deep copy“操作
String toString();
返回对象的字符串表现形式,通常该方法返回该对象的的”文本表示“的一个字符串,结果应该是信息简明,信息表现便于人阅读,建议所有子类重写此方法,返回一个字符串组成类的名称的对象的一个实例,和符号@,和该对象hashCode无符号十六进制的表现形式,既:
getClass().getName() + '@' + Integer.toHexString(hashCode())
final native void notify();
在对象监控上唤醒一个正在等待的线程,若该对象上任何线程都在等待,选择其中的一个被唤醒,选择是任意的,取决于discretion的实现。一个线程在对象监控上等待,可以通过调用一个wait方法。
被唤醒的线程将无法继续进行,直到当前线程释放此对象上的锁。被唤醒的线程以常规方式与任何其他可能线程竞争同步对象。如,被唤醒的线程在锁定此对象的下一个线程有不可靠的特权和缺点。
此方法只能被一个拥有此对象监视器的线程调用,一个线程成为对象监视器的拥有者通过下面3种方法之一:
通过执行一个同步的该对象的实例方法;
通过执行一个同步的语句块(同步对象);
对于Class的对象,通过执行类的synchronized static方法;
一次只能有一个线程拥有对象监视器,若当前的线程不是对象监视器的拥有者,则抛出IllegalMonitorStateException
final native void notifyAll();
唤醒对象监视器上所有等待的线程,一个线程在对象监控上等待,可以通过调用一个wait方法。
final native void wait(long timeout);
使当前线程等待直到另一个线程调用notify/notifyAll方法,或者一个指定的时间已经过去。
当前线性必须是对象监视器拥有者。该方法使当前线程T为该对象将自己等待,然后放弃此对象上任何和所有的同步请求,线程T在线程调度上将变成disable并处于休眠状态,直到有如下事情发生:
一些其他的线程为该对象调用notiy方法并且线程T正好是任意选择的线程被唤醒;
一些其他的线程为该对象调用notiyAll方法;
一些其他的线程中断了线程T;
指定的实际时间已过,或多或少。如果timeout为0,不考虑实际时间和线程只是等待通知;
然后线程T从等待集中移除为该对象和重新进行线程调度。它以常规方式与任何其他可能线程竞争同步对象,一旦它获得了对象的控制,该对象上的所有同步请求将被恢复到原状。这是wait方法被调用根据时间的情况。线程T从调用wait方法调用返回,因此,在wait方法返回,对象同步的状态和线程T状态都精确的到wait方法调用后。
一个线程也可以不使用notify,interrupted,timing out来唤醒,称”伪唤醒“,然而,这很少发生在实际上,应用必须防范的测试需要被唤醒的线程,且如条件不满足继续等待。换言之,等待总是发生在循环中,如:
synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout);
... // Perform action appropriate to condition
}
若当前线程被中断在任何线程之前或在其等待期间,则抛出InterruptedException,该异常不抛出知道此对象的锁定状态已经恢复。
注意wait方法,为该对象将当前线程设置等待,只有这个对象解锁;任何其他对象在当前线程可以同步,线程等待时仍处于锁定。 此方法只能被一个拥有此对象监视器的线程调用。
void finalize()
调用垃圾收集器在垃圾收集对象确定没有其他对象的引用。子类可重写该方法处理系统资源或执行其他cleanup。
若jvm已经调用该方法,不再有任何方法通过活动线程来访问这个对象,除非由于准备终结一些其他对象or类采取动作的结果。
finalize方法可以采取任何操作,包括再次使此对象对其他线程可用;不过,通常其目的是在不可撤销的丢弃对象之前执行清除操作。
如:表示输入/输出连接的对象的 finalize 方法可执行显式 I/O 事务,以便在永久丢弃对象之前中断连接。
Object 类的 finalize 方法执行非特殊性操作;它仅执行一些常规返回。Object 的子类可以重写此定义。
Java 编程语言不保证哪个线程将调用某个给定对象的 finalize 方法。但可以保证在调用 finalize 时,调用 finalize 的线程将不会持有任何用户可见的同步锁定。如果 finalize 方法抛出未捕获的异常,那么该异常将被忽略,并且该对象的终结操作将终止。
在启用某个对象的 finalize 方法后,将不会执行进一步操作,直到 Java 虚拟机再次确定尚未终止的任何线程无法再通过任何方法访问此对象,其中包括由准备终止的其他对象或类执行的可能操作,在执行该操作时,对象可能被丢弃。
对于任何给定对象,Java 虚拟机最多只调用一次 finalize 方法。
finalize 方法抛出的任何异常都会导致此对象的终结操作停止,但可以通过其他方法忽略它。