java中clone属性_Java 中如何使用clone()方法克隆对象?

问题阐述

在程序开发时,有时可能会遇到以下情况:已经存在一个对象A,现在需要一个与A对象完全相同的B 对象,并对B 对象的属性值进行修改,但是A 对象原有的属性值不能改变。这时,如果使用Java 提供的对象赋值语句,当修改B 对象的属性值后,A 对象的属性值也将被修改。那么应该如何实现创建一个与A 对象完全相同的B 对象,但是改变B对象的属性值时A 对象的属性值不变呢?

专家解答

要实现这一功能,可以使用Object 类中的clone()方法。clone()方法可以用来完成对象的浅克隆。所谓浅克隆就是说被克隆的对象各个属性都是基本类型,而不是引用类型。如果存在引用类型的属性,则需要进行深克隆。下面对这两种克隆方式进行举例说明。

1.浅克隆(1)编写Address 类,首先在该类中定义state(表示国家)、province(表示省)和city(表示市)3 个域,然后在构造方法中初始化这3 个域,并提供getter()和setter()方法用于获得和修改这3 个域,最后重写toString()方法方便输出该类的对象,代码如下:

9dc91f616cae26799a690e37afd8533c.png

(2)编写Employee 类,首先在该类中定义name(表示姓名)、age(表示年龄)和address(表示地址)3 个域,然后在构造方法中初始化这3 个域,并提供getter()和setter()方法用于获得和修改这3 个域,再重写toString()方法方便输出该类的对象,最后重写clone()方法来提供克隆的功能,代码如下:

024d624d3e578b77122f63f7f472384f.png

说明:

在Java 5.0 以上版本中,支持重写方法时返回协变类型,因此可以返回Employee 对象。

(3)编写类Test 进行测试,在该类中,首先创建address 对象并对其初始化,然后创建employee1 对象并对其初始化,再使用employee1 的克隆方法创建employee2 对象,并修改employee2 的address 属性,最后将两个employee 对象输出,代码如下:

3c986c19dbd3fe6c9f39a9a5ec7ae0a3.png

6ef3f2740ee76071cf8349702fe49668.png

代码的运行结果如图7.7 所示。

ad69b052c9de52470338b25bce780507.png

说明:

从图7.7 中可以看到,对于引用类型并没有克隆成功。

2.深克隆(1)编写类Address1,在该类中首先定义state(表示国家)、province(表示省)和city(表示市)3 个域,然后在构造方法中初始化这3 个域,并提供了getter()和setter()方法用于获得和修改这3 个域,再重写toString()方法方便输出该类的对象,最后重写clone()方法提供克隆的功能,关键代码如下:

572aa490cc98f9c8146dba8cbc5b3fb3.png

f0eada715a4933036ce26f4addf26e1a.png

说明:

Address 类的域不是基本类型就是不可变类型,所以可以直接使用浅克隆。

(2)编写Employee1 类,首先在该类中定义name(表示姓名)、age(表示年龄)和address(表示地址)3 个域,然后在构造方法中初始化这3 个域,并提供getter()和setter()方法用于获得和修改这3 个域,再重写toString()方法方便输出该类的对象,最后重写clone()方法来提供克隆的功能。代码如下:

7a6fe61166a38179aadc6c0bae678273.png

cb0e359af1db5746b2c63879eedb22ba.png

(3)编写类Test1 进行测试,在该类中,首先创建了address 对象并对其进行初始化,然后创建employee1 对象并对其进行初始化,再使用employee1 的克隆方法创建employee2对象,并修改employee2 的address 属性,最后将两个employee 对象输出,代码如下:

f6d85a69244c8b2ceab1814ba0194140.png

上面代码的运行结果如图7.8 所示。

c0a1499c1b241ebe75f01f11972c650c.png

专家点评

如果需要克隆的对象的域包含引用类型,则需要使用深克隆;反之,可以直接使用Object 类提供的clone()方法进行浅克隆。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值