Java 中如何使用clone()方法克隆对象?(1)

public Address getAddress() {

return address;

}

public void setAddress(Address address) {

this.address = address;

}

@Override

public String toString() { //重新toString()方法

return “Employee{” +

“姓名='” + name + ‘’’ +

“, 年龄=” + age +

“, 地址=” + address +

‘}’;

}

public Employee clone() { //实现浅克隆

Employee employee = null;

try {

employee = (Employee) super.clone();

employee.address = address.clone();

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

return employee;

}

}

测试类:

package com.nf147.Constroller;

public class TestClone {

public static void main(String[] args) {

System.out.println(“克隆之前:”);

Address address = new Address(“中国”, “吉林”, “长春”);

Employee employee1 = new Employee(“无语”, 32, address);

System.out.println(“员工 1 的信息”);

System.out.println(employee1);

System.out.println(“====================”);

System.out.println(“克隆之后:”);

Employee employee2=employee1.clone();

employee2.getAddress().setState(“中国”);

employee2.getAddress().setProvince(“辽宁”);

employee2.getAddress().setCity(“大连”);

employee2.setName(“倾城”);

employee2.setAge(33);

System.out.println(“员工2 的 信息”);

System.out.println(employee2);

System.out.println(“员工1的 信息”);

System.out.println(employee1);

}

}

截图:

说明:

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

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

package com.nf147.Constroller;

public class Address implements Cloneable {

private String state; //国家

private String province; //省

private String city; //市

public Address() {

}

public Address(String state, String province, String city) {

this.state = state;

this.province = province;

this.city = city;

}

public String getState() {

return state;

}

public void setState(String state) {

this.state = state;

}

public String getProvince() {

return province;

}

public void setProvince(String province) {

this.province = province;

}

public String getCity() {

return city;

}

public void setCity(String city) {

this.city = city;

}

@Override

public String toString() { //重写toString

StringBuilder sb=new StringBuilder();

sb.append(“国家:”+state+“,”);

sb.append(“省:”+province+“,”);

sb.append(“市:”+city+“,”);

return sb.toString();

}

@Override

protected Address clone(){

Address address = null;

try{

address=(Address)super.clone();

}catch (CloneNotSupportedException e){

e.printStackTrace();

}

return address;

}

}

说明:

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

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

package com.nf147.Constroller;

public class Employee implements Cloneable {

private String name; //姓名

private int age; //年龄

private Address address; //地址

public Employee(String name, int age, Address address) {

this.name = name;

this.age = age;

this.address = address;

}

public Employee() {

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public Address getAddress() {

return address;

}

public void setAddress(Address address) {

this.address = address;

}

@Override

public String toString() { //重新toString()方法

return “Employee{” +

“姓名='” + name + ‘’’ +

“, 年龄=” + age +

“, 地址=” + address +

‘}’;

}

public Employee clone() { //实现浅克隆

Employee employee = null;

try {

employee = (Employee) super.clone();

employee.address = address.clone();

} catch (CloneNotSupportedException e) {

e.printStackTrace();

}

return employee;

}

}

测试:

package com.nf147.Constroller;

public class TestClone {

public static void main(String[] args) {

System.out.println(“克隆之前:”);

Address address = new Address(“中国”, “吉林”, “长春”);

Employee employee1 = new Employee(“无语”, 32, address);

System.out.println(“员工 1 的信息”);

System.out.println(employee1);

System.out.println(“====================”);

System.out.println(“克隆之后:”);

Employee employee2=employee1.clone();

employee2.getAddress().setState(“中国”);

employee2.getAddress().setProvince(“辽宁”);

employee2.getAddress().setCity(“大连”);

employee2.setName(“倾城”);

employee2.setAge(33);

System.out.println(“员工2 的 信息”);

System.out.println(employee2);

System.out.println(“员工1的 信息”);

System.out.println(employee1);

}

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。*

[外链图片转存中…(img-BjBCT2WF-1715702907218)]

[外链图片转存中…(img-6kJdsxjc-1715702907219)]

[外链图片转存中…(img-P5urPiVq-1715702907219)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值