【问题标题】:Java object assignment confusion [closed]Java对象分配混乱[关闭]
【发布时间】:2016-03-19 19:31:21
【问题描述】:

我在观看视频时看到了这段代码,但我不确定它为什么会起作用。

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

【问题讨论】:

  • imagepixels 是对象成员,您可以在构造函数 Test() 中创建它们。它们是 cached 并且在您的循环中是相同的数据。 pixels 上的循环正在准确写入图像的像素数组,您正在使用 paintComponent() 方法绘制。

标签: java arrays bufferedimage


【解决方案1】:

这是因为在 java 中,您不会将对象存储在字段和变量中,而是存储内存地址(有点像 c++ 中的指针(注意:它们实际上是指针,这就是为什么异常称为 Null指针例外))。当你复制一个变量时,你得到的不是一个新对象,而是同一个对象的相同内存地址,所以如果你编辑那个对象,你只编辑存储在内存中的那个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 2010-11-19
    • 2021-07-17
    相关资源
    最近更新 更多