JAVA中有基本类型和对象的概念,浅拷贝拷贝的就是基本类型的值和对象的引用,深拷贝不但拷贝对象的引用还拷贝对象引用所指向的值。
JAVA中的万类之父Object中的clone方法,默认是浅拷贝的实现,测试用例如下:
package com.example.demo;
/**
* Clone测试
*
* @author:liuwenjun
* @version:1.0
* @date: 2018/4/4
*/
public class CloneTest {
static class Color {
private String name;
public Color(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Color{" +
"name='" + name + '\'' +
'}';
}
}
static class Package implements Cloneable {
private String name;
private Color color;
public Package(String name, Color color) {
this.name = name;
this.color = color;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Color getColor() {
return color;
}
public void setColor(Color color) {
this.color = color;
}
public Package clone() throws CloneNotSupportedException {
Package pkg;
//浅拷贝,拷贝引用
pkg = (Package) super.clone();
//深拷贝,重新开辟内存地址
//pkg.setColor(new Color(pkg.getColor().getName()));
return pkg;
}
@Override
public String toString() {
return "Package{" +
"name='" + name + '\'' +
", color=" + color +
'}';
}
}
public static void main(String[] args) throws CloneNotSupportedException {
Package pkg1 = new Package("Dior", new Color("Red"));
System.out.println(pkg1.toString());
Package pkg2 = pkg1.clone();
pkg2.setName("0007");
pkg2.getColor().setName("White");
System.out.println(pkg1);
System.out.println(pkg2);
}
}