有这样一个例子,第一个箱子有赤橙黄绿青蓝紫7色气球,现在希望第二个箱子的气球和第一个箱子一样,只是最后一个气球是蓝色的。对于这个问题,我们自然会想到拷贝的方法来解决问题。
附代码:
import java.text.Collator; import java.util.Arrays; import java.util.Comparator; import java.util.Locale; public class Test4 { @SuppressWarnings({ "rawtypes", "unchecked" }) public static void main(String[] args) { int ballonNum = 7; Balloon[] box1 = new Balloon[ballonNum]; for (int i = 0; i < ballonNum; i++) { box1[i] = new Balloon(Color.values()[i], i); } Balloon[] box2 = Arrays.copyOf(box1, box1.length); box2[6].setColor(Color.Blue); for (Balloon b : box1) { System.out.println(b); } } } enum Color { Red, Orange, Yellow, Green, Indigo, Blue, Violet; } class Balloon { private int id; private Color color; public Balloon(Color _color, int _id) { color = _color; id = _id; } public int getId() { return id; } public void setId(int id) { this.id = id; } public Color getColor() { return color; } public void setColor(Color color) { this.color = color; } public String toString() { return new StringBuffer().append("编号:" + id + "颜色:" + color + ";") .toString(); } }
现在我们看看通过拷贝后的第一个箱子的气球的颜色是什么样子的:
我们看到最后一个气球变成了blue。我们只希望第二个箱子改变最后一个气球的颜色,这和我们预想的不一样。到底哪地方出了问题?
我们知道,通过copyOf方法产生的数组是一个浅拷贝,拷贝有个很重要的规则(数组的clone方法也是与此相同的,同样是浅拷贝):基本类型都是直接拷贝值,其他都是拷贝引用地址。问题找到了(调用了相同的引用地址),那么修改的方法可以如下:
import java.text.Collator; import java.util.Arrays; import java.util.Comparator; import java.util.Locale; public class Test4 { @SuppressWarnings({ "rawtypes", "unchecked" }) public static void main(String[] args) { int ballonNum = 7; Balloon[] box1 = new Balloon[ballonNum]; for (int i = 0; i < ballonNum; i++) { box1[i] = new Balloon(Color.values()[i], i); } Balloon[] box2 = Arrays.copyOf(box1, box1.length); //box2[6].setColor(Color.Blue); Balloon bb=new Balloon(Color.Blue,6); box2[6]=bb; for (Balloon b : box1) { System.out.println(b); } } } enum Color { Red, Orange, Yellow, Green, Indigo, Blue, Violet; } class Balloon { private int id; private Color color; public Balloon(Color _color, int _id) { color = _color; id = _id; } public int getId() { return id; } public void setId(int id) { this.id = id; } public Color getColor() { return color; } public void setColor(Color color) { this.color = color; } public String toString() { return new StringBuffer().append("编号:" + id + "颜色:" + color + ";") .toString(); } }
第一个箱子气球颜色为:
这下就对了。