java - 对象数组的概念问题
问题描述
我是一个非常新的 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);
}
//...............................
}
但我真的不明白为什么会这样。而且,我想以更优雅的方式初始化数组,但我找不到。我会很感激你的意见。谢谢!
解决方案
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 中的工作方式。
推荐阅读
- typescript - 将具有新属性的模型推送到 MongoDB
- reactjs - 无法在下一个 js 中运行 swiperjs。未找到模块:包路径 ./swiper.scss 未从包中导出
- android - 生成的带有 CI/CD 集成的 apk 在真正的 android 设备中崩溃
- java - 如何为 java AmazonS3 客户端设置端点?
- python - Python:如何将绘图上的 X 标签设置为重复范围?
- flutter - 如何在 SfCalendar 的议程中显示时间?议程只显示主题而不是开始和结束时间
- ruby-on-rails - 将模型更改为多态并保持关系
- python - Beautifulsoup find_all() 具有多个 AND 条件
- c - CS50 pset4滤镜模糊功能将整个图像变成一种颜色
- sql - 在 SQL 中检测到重叠,未在选择中使用子查询且未将重复记录添加到结果集中