想要了解浅拷贝和深拷贝之前,要了解的是值传递和引用传递。
值传递:传递的是变量的值,对该值进行修改不会影响原来变量的值
引用传递:传递的是变量的在堆中的引用,修改其值,会影响实际变量
这里只是简单的介绍,想要详细了解的话,建议查看其他博客
知道了值传递和引用传递就可以来了解浅拷贝和深拷贝了
浅拷贝:基本类型拷贝的是值,引用类型拷贝的是引用
深拷贝:基本类型拷贝的是值,引用类型拷贝的也是值
用具体的例子来展示浅拷贝和深拷贝,重写clone方法需要实现Cloneable标识接口,标识该类是可以拷贝的,不然拷贝时会报错
首先申明两个类
Boy类
package clone;
public class Boy implements Cloneable {
private Girl girl;
private String name;
private int age;
@Override
public String toString() {
return "Boy [girl=" + girl + ", name=" + name + ", age=" + age + "]";
} public Boy() {
super();
// TODO 自动生成的构造函数存根
} public Boy(Girl girl, String name, int age) {
super();
this.girl = girl;
this.name = name;
this.age = age;
} public Girl getGirl() {
return girl;
} public void setGirl(Girl girl) {
this.girl = girl;
} 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;
} @Override
protected Object clone() throws CloneNotSupportedException {
// TODO 自动生成的方法存根
Boy clone = (Boy) super.clone();
//浅拷贝时去除,下面这句话
clone.girl = (Girl) girl.clone();
return clone;
}}
Girl类
package clone;
public class Girl implements Cloneable {
private String name;
private int age;
public Girl(String name, int age) {
super();
this.name = name;
this.age = age;
} public Girl() {
super();
// TODO 自动生成的构造函数存根
} 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;
} @Override
public String toString() {
return "Girl [name=" + name + ", age=" + age + "]";
} @Override
protected Object clone() throws CloneNotSupportedException {
// TODO 自动生成的方法存根
return super.clone();
}
}
【clone的深拷贝与浅拷贝】测试类
package clone;
public class CloneTest { public static void main(String[] args) throws CloneNotSupportedException {Girl girl = new Girl("Helen", 32);
Boy boy = new Boy(girl, "Mike", 33);
Boy boy1 = (Boy) boy.clone();
boy1.getGirl().setName("Smith");
System.out.println(boy);
System.out.println(boy1);
}}
当我们用的是浅拷贝时,查看代码的运行结果
文章图片
可以看到修改boy1时,boy中的值也被改变了
再来使用深拷贝,查看代码的运行结果
文章图片
可以看到修改boy1的值不会对boy产生影响
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)