Java 对象分配混乱
Java object assignment confusion
我在观看视频时看到了这段代码,我不太确定它为什么有效。
BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);
int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
如果您更改数组中的数据:
for (int i = 0; i < pixels.length; i++) {
pixels[i] = 0xff0000;
}
图片也变了。有人可以解释这是为什么吗?我以为第一个赋值会将数组设置为图像数据,但 for 循环中的赋值会使数组与图像无关。为什么更改数组中的值会更改图像中的数据?
完整示例:
public class Test extends JPanel {
private static final long serialVersionUID = 1L;
private BufferedImage image;
private int[] pixels;
public Test() {
setPreferredSize(new Dimension(500, 500));
image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);
pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < pixels.length; i++) {
pixels[i] = 0xff0000;
}
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
Test test = new Test();
frame.getContentPane().add(test);
frame.pack();
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
}
}
编辑
我已经解决了我的问题,但为了澄清我对可能偶然发现这个问题的人的要求,我的问题是关于 Java 中的作业。我没有意识到变量在分配时被赋予了内存地址,而不是对象的副本。因此,当一个变量被分配给一个对象时,如果变量发生变化,原始对象也会发生变化(至少我认为是这样说的,如果我错了请纠正我)。谢谢你回答我的问题。
这是因为在java中,你不在字段和变量中存储对象,而是存储一个内存地址(有点像c++中的指针(注意:它们是字面上的指针,这就是异常的原因称为 NullPointerException))。当你复制一个变量时,你得到的不是一个新的对象,而是同一个对象的相同内存地址,所以如果你编辑那个对象,你只编辑存储在内存中的那个。
我在观看视频时看到了这段代码,我不太确定它为什么有效。
BufferedImage image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);
int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
如果您更改数组中的数据:
for (int i = 0; i < pixels.length; i++) {
pixels[i] = 0xff0000;
}
图片也变了。有人可以解释这是为什么吗?我以为第一个赋值会将数组设置为图像数据,但 for 循环中的赋值会使数组与图像无关。为什么更改数组中的值会更改图像中的数据?
完整示例:
public class Test extends JPanel {
private static final long serialVersionUID = 1L;
private BufferedImage image;
private int[] pixels;
public Test() {
setPreferredSize(new Dimension(500, 500));
image = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);
pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
for (int i = 0; i < pixels.length; i++) {
pixels[i] = 0xff0000;
}
g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Test");
Test test = new Test();
frame.getContentPane().add(test);
frame.pack();
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setResizable(false);
frame.setVisible(true);
}
}
编辑 我已经解决了我的问题,但为了澄清我对可能偶然发现这个问题的人的要求,我的问题是关于 Java 中的作业。我没有意识到变量在分配时被赋予了内存地址,而不是对象的副本。因此,当一个变量被分配给一个对象时,如果变量发生变化,原始对象也会发生变化(至少我认为是这样说的,如果我错了请纠正我)。谢谢你回答我的问题。
这是因为在java中,你不在字段和变量中存储对象,而是存储一个内存地址(有点像c++中的指针(注意:它们是字面上的指针,这就是异常的原因称为 NullPointerException))。当你复制一个变量时,你得到的不是一个新的对象,而是同一个对象的相同内存地址,所以如果你编辑那个对象,你只编辑存储在内存中的那个。