总是覆盖toString()以返回用户可读的信息,注意的地方:
1.提供getter方法以单独获取toString()返回的数据,避免使用者解析toString()以获取数据
2.如果toString()返回的格式化的字符串,那么需提供注释说明,同时提供静态格式化方法
clone方法容易导致错误,一般不建议使用此方法,而是提供相应的构造函数或者静态工厂方法用于对象复制
Object的clone()是protected,并且直接抛出CloneNotSupportedException。子类如果要覆盖clone(),必须声明实现Cloneable接口。如果类声明实现Cloneable接口,那么调用此类的对象的clone()不会抛出异常
一般覆盖clone()代码如下:
@Override
//声明为public,不抛出异常,返回具体类型的对象
public PhoneNumber clone(){
try{
//必须调用super.clone()获取被复制的对象
PhoneNumber result=(PhoneNumber)super.clone();
//此处可以设置被复制的对象的具体属性值
return result;
}catch (CloneNotSupportedException e) {
//因为类声明实现Cloneable接口,所以永远不会抛出此异常
throw new AssertionError();
}
}
覆盖clone()需要注意的地方:
1.总是调用super.clone()获取被复制的对象
2.不要在clone()里调用构造函数(应调用super.clone()),复制对象时也不会调用任何构造函数
3.不要在clone()里调用非final的方法,以避免被复制的子类对象状态不正确(子类可能覆盖父类方法以设置自身的属性值)
4.如果类包含final属性,当其对象被clone时,此属性不会被设置(未测试)
5.如果被clone的对象包含非基本数据类型的属性,那么需要自行复制这些属性(deep copy)
6.在多线程环境,考虑使用synchronized声明clone()