警惕数组的浅拷贝

        有这样一个例子,第一个箱子有赤橙黄绿青蓝紫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();

    }
}

现在我们看看通过拷贝后的第一个箱子的气球的颜色是什么样子的:

QQ图片20160428160939

我们看到最后一个气球变成了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();

    }
}

第一个箱子气球颜色为:

 

QQ图片20160428161801

这下就对了。

posted @ 2016-04-28 16:19  涉务  阅读(225)  评论(0编辑  收藏  举报