方法
- 获取对象的Class对象引用
Class<?> getClass()
- 计算hash值
int hashCode();
- equals方法
Java中的 == 用于对象时比较时,仅判断引用是否相等。
boolean equals(); //默认实现语义同 '==' 运算符
- clone()
Object clone();
- toString()
String toString();
- notify()
void notify();
- notifyAll()
void notifyAll();
- wait();
void wait(timeout)
void wait()
拷贝
如果利用clone()方法拷贝,需要实现cloneable 接口
因为对象中属性可能存在引用类型,所以就有所谓的深拷贝与浅拷贝。
- 浅拷贝,新旧对象的引用指向同一内存区域。
Class Birthday{
int year;
int month;
...
}
class Person{
String name;//String类型(特殊)
int age;//基本数据类型
Birthday birthday;//引用类型
...
}
main(){
Person p1 = new Person("beauty", 18, new Birthday(2018, 12, 25));
Person p2 = person.clone();
p1.birthday == p2.birthday;//true,birthday属性指向同一内存空间,浅拷贝。
}
- 深拷贝:对于有引用类型(除不可变对象的引用(如String)外)的对象,一般考虑深拷贝
//深拷贝需要覆写 clone方法
//Person类的clone()方法覆写
public Object clone(){
Person p = (Person)super.clone();
p.setBirthday((Birthday)this.birthday.clone());//属性所属类也需要实现Cloneable接口
return p;
}
//Birthday的clone()方法覆写
public Object clone(){
return super.clone();//因为该类中没有引用类型。
}
关键点
- 通过clone方法的覆写来实现深拷贝,往往需要类层次结构每个类都实现深拷贝
- 可以考虑将类设计为不可变对象(如string),来简化深拷贝的实现。
- 不可变对象设计,可以考虑将内部属性申明为final的方式。
网友评论