Java 变量和对象(object)复制
对于对象而言,也可以仅仅复制其中的变量通过使用variableCopy()。改变变量时就直接在建好的对象上改即可。
public static void variableCopy() {
Knight k1 = new Knight(“Sir Lancelot”);
Knight k2 = new Knight(“King Arthur”);
k1 = k2;
k1.setName("Sir Galahad");
System.out.println(k1.getName());
System.out.println(k2.getName());
}
复制整个对象,就需要通过需要被复制的那个对象再建立一个新的对象,表示这是一个不同于原来的对象。
public static void objectCopy() {
Knight k1 = new Knight("Sir Lancelot");
Knight k2 = new Knight("King Arthur");
k1 = new Knight(k2.getName());
k1.setName("Sir Galahad");
System.out.println(k1.getName());
System.out.println(k2.getName());
}
复制也分为浅层复制和深层复制
public static void shallowCopy() {
Dragon d1 = new Dragon(“Drago”, false);
Dragon d2 = new Dragon(“Pendragon”, true);
Knight k1 = new Knight("Sir Lancelot", d1);
Knight k2 = new Knight("King Arthur", d2);
k1 = new Knight(k2.getName(), k2.getDragon());
k1.setName("Sir Galahad");
k1.getDragon().setName("Livyathan");
System.out.println(k1);
System.out.println(k2);
}
对于K1而言,因为它的龙的值是从K2得到的,因此它在更改K1的龙的名字时候就把K2的龙的名字一并改了,运行出来的结果就是这样的:
Knight: Sir Galahad, his dragon is: Livyathan
Knight: King Arthur, his dragon is: Livyathan
而深层复制就不会出现这样的情况因为它在用K2的值的时候new了一个新的,因此K1和K2的值是独立的
public static void deepCopy() {
Dragon d1 = new Dragon(“Drago”, false);
Dragon d2 = new Dragon(“Pendragon”, true);
Knight k1 = new Knight("Sir Lancelot", d1);
Knight k2 = new Knight("King Arthur", d2);
k1 = new Knight(k2.getName(),
new Dragon(k2.getDragon().getName(),
k2.getDragon().isBreathesFire()));
k1.setName("Sir Galahad");
k1.getDragon().setName("Livyathan");
System.out.println(k1);
System.out.println(k2);
}
这些仅仅是复制的方法,但如果想要运行的话就还需要main的部分来支撑,代码如下:
public static void main(String[] args) {
System.out.println("1) variable copy");
variableCopy();
System.out.println("2) object copy");
objectCopy();
System.out.println("3) shallow copy");
shallowCopy();
System.out.println("4) deep copy");
deepCopy();
}