3.10-3.11 toString()、clone()

总是覆盖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()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值