1.方法简介
1> Object clone() ---->创建并返回对象的副本
2> boolean equals(Object obj) -->某个其他对象是否与该对象“相等”
3> void finalize() --->当垃圾回收器确定不存在该对象的更多引用时,由对象的垃圾回收器调用此方法进行回收
4> Class getClass() ---> 返回一个对象运行时类
5> int hashCode --->返回对象的哈希码值
6>void notify --->唤醒在此对象监视器上等待的单个进程。
7> void notifyAll ---> 唤醒在此对象监视器上等待的所有进程
8>String toString() --->返回该对象的字符串表示
9> void wait() ---->导致当前对象等待,直到其他线程调用该对象的notify()或是notifyAll()方法
10> void wait(long timeout) --->导致当前对象等待,直到其他线程唤醒或是超过指定的时间量
11> void wait(long timeout,int nanos) --->...........或者某个其他线程中断当前线程。
2.重点说明
1>hashCode ,常规规定:在java应用程序执行期间,同一对象调用hashCode(),必须返回相同的整数。前提是equals比较中所用的信息没有被修改。不同程序的执行,无需一致。如果根据equals(Object)调用两个对象相等,则hashCode也是相同的。
2>equals队形必须是同一对象的引用,才会true。重写该方法,为了维护常规规定,要重写hashCode
3>clone, 这里对象的副本是浅复制。
浅复制:被复制对象的所有变量都含有与原来对象相同的值,而所有的对其他对象的引用,仍指向其原来的对象 (仅复制所考虑的对象,而不复制所引用的对象)
深复制:引用其他对象的变量将指向被复制的新的对象。(把复制的对象所引用的所有对象都复制一遍)
Cloneable实现其接口可重写clone方法,o=(student)super.clone;;;;如果是深复制,则要在重写的方法中进行其他引用复制:o.p=(Teacher)p.clone();
如果引用层次比较高,要层层深度clone,且每个对象都要实行Cloneable接口,比较麻烦,可以用序列化。
对象序列化:将对象的状态转化为字节流,再通过这些值生成相同状态的对象。对象都实现Serializable接口。
public Object deepClone()throws...{
ByteArrayOutputstream bo=new ByteArrayOutputStream();
ObjectOutputstream oo=new ObjectOutputStream(bo);
oo.writeObject(this); //将对象写在流里
ByteArrayInputStream bi=new ByteArrayInputStream();
ObjectInputStream oi=new ObjectInputStream(bi);
return(oi.readObjct()); //丛流里读出来
}
4>toString() 返回:getClass.getName+'@'+Integer.toHexString(hashCode()) 此对象哈希码的无符号十六进制
5> notify() 选择一个线程唤醒,是任意的。竞争的结果