首页 > 解决方案 > 对象数组的概念问题

问题描述

我是一个非常新的 Android/Java 程序员。下面是产生我不清楚的结果的代码。另外,我把我找到的“解决方案”,但不能满足我的好奇心。`

//Here I define my class to hold data
public class ImageData {
    Date date;
    byte[] image;
}

// Here I initialize the array photos and put getter and setter
abstract class Variables {
    public static ImageData photos = new ImageData[4];
    static ImageData getPhotos(int n) {
        return photos[n];
    }
    static void setPhotos(ImageData photos, int n) {
        Variables.photos[n] = photos;
    }
}

// Here, at the very begining of app, initialize the array
        Variables.photos[0] = new ImageData();
        Variables.photos[1] = new ImageData();
        Variables.photos[2] = new ImageData();
        Variables.photos[3] = new ImageData();

// And now, I use those objects

    public void run() {// This DOES NOT WORK (all photos have the last image)
        // get 4 photos and save result in global
        int count;
        ImageData localPhoto = new ImageData();
        // clear global (at least the byte[]
        for (count = 0; count > 4; count++) {
            localPhoto.image = null;
            setPhotos(localPhoto, count);
        }
        // take 4 pictures
        for (count = 0; count < 4; count++) {
            localPhoto.image = getPhoto(ipCamera, port);
            localPhoto.date = Calendar.getInstance().getTime();
            setPhotos(localPhoto, count);
        }
        //...............................
    }

正如我在评论中所说,所有四张照片.图像都是相同的(也是日期)。我使用以下方法工作:

   public void run() { // This WORKS
        // get 4 photos and save result in global
        int count;
        ImageData localPhoto; // declared, not initialized
        // clear global (at least the byte[] )
        for (count = 0; count > 4; count++) {
            localPhoto = new ImageData(); // <<<<<<<<<<<<<<<<< NEW
            localPhoto.image= null;
            setPhotos(localPhoto, count);
        }
        // take 4 pictures
        for (count = 0; count < 4; count++) {
            localPhoto = new ImageData(); // <<<<<<<<<<<<<<<<< NEW
            localPhoto.image = getPhoto(ipCamera, port);
            localPhoto.date = Calendar.getInstance().getTime();
            setPhoto(localPhoto, count);
        }
        //...............................
    }

但我真的不明白为什么会这样。而且,我想以更优雅的方式初始化数组,但我找不到。我会很感激你的意见。谢谢!

标签: javaandroidarrays

解决方案


public void run() {// This DOES NOT WORK (all photos have the last image)
    // get 4 photos and save result in global
    int count;
    ImageData localPhoto = new ImageData();

上面的行创建了一个ImageData()对象并为其分配了一个名为 的引用localPhoto

    // clear global (at least the byte[]
    for (count = 0; count > 4; count++) {
        localPhoto.image = null;

这将设置image先前创建的对象中的字段。请注意,它image 在同一个对象中设置了四次

        setPhotos(localPhoto, count);

现在您调用setPhotos()并传入对同一对象的引用四次。

    }
    // take 4 pictures
    for (count = 0; count < 4; count++) {
        localPhoto.image = getPhoto(ipCamera, port);
        localPhoto.date = Calendar.getInstance().getTime();
        setPhotos(localPhoto, count);

如上面的描述,每次循环重复时,您都在使用对同一对象的引用。所以数组中的所有四个元素都指向同一个对象。

    }
}

现在看看你的变化

    for (count = 0; count > 4; count++) {
        localPhoto = new ImageData(); // <<<<<<<<<<<<<<<<< NEW
        localPhoto.image= null;
        setPhotos(localPhoto, count);
    }

这解决了问题,因为您在每次迭代中都创建了一个新对象。localPhoto每次都将引用分配给不同的对象。

为了更好地理解这一点,请阅读参考变量在 Java 中的工作方式。


推荐阅读