Java对象分配混乱

时间:2016-03-19 19:31:22

标签: java arrays bufferedimage

我在观看视频时看到了这段代码,我不确定它为什么会有效。

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的作业。在分配时,我没有意识到变量被赋予了内存地址,而不是对象的副本。因此,当一个变量被分配给一个对象时,如果变量发生变化,原始对象也会变化(至少我认为这就是所说的,如果我错了,请纠正我)。感谢您回答我的问题。

1 个答案:

答案 0 :(得分:2)

这是因为在java中,你不存储字段和变量中的对象,你存储一个内存地址(有点像c ++中的指针(注意:它们实际上是指针,这就是为什么异常被称为Null <强>指针异常))。复制变量时,不是获取新对象,而是获取相同对象的相同内存地址,因此如果编辑该对象,则只编辑存储在内存中的对象。