java - Java 中奇怪的数组行为

标签 java arrays repaint

我最近一直在做一些 Java 编码,遇到了这个非常奇怪的问题。我用 Java 编写了一个类,它扩展 JPanel 并根据其大小调整对象的大小。

为了更好地理解,我将问题简化为尽可能小的代码。

问题是,当我运行下面的代码时,它总是不仅会设置 array1[0],还会设置 array2[0]。我不明白为什么 array2 会改变,即使我从未改变过它......

我添加了一些内容以突出显示我认为代码执行的操作,但我看不到。

当我运行代码并调整窗口大小时,打印出的值会迅速变化,稍微移动一下就会变成无穷大。

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Beispiel extends JPanel {

    double[] array1, array2;

    public Beispiel(double[] array){
        array1 = array;
        array2 = array;
    }

    public void repaint(){
        try {
            array1[0] = array2[0]*this.getWidth();
            System.out.println(array2[0]);
            // array2[0] = array1[0]   <--- what i think it does
        } catch(Exception e){
        }
    }

    public static void main(String[] args){
        JFrame frame = new JFrame();
        frame.setSize(300,200);
        frame.setLayout(new BorderLayout());

        double[] array = {1.0,3.0};

        frame.add(new Beispiel(array));

        frame.setVisible(true);
    }
}

最佳答案

array2 确实改变了。当您使用 array1 = arrayarray2 = array 时,您使 array1array2 引用相同的内容大批。因此,对 array1 所做的任何更改也会反射(reflect)在 array2 中。

要解决此问题,请使用 java.util.Arrays.copyOf(array, array.length)array.clone()(请注意,这会返回一个浅表但是,数组的副本)。

关于java - Java 中奇怪的数组行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29023387/

相关文章:

java - 在 ActionListener 中使用 Thread.sleep() 的简单动画

java - 在应用程序中添加到 JPanel

java - GWT 突然停止执行

java - 调试Java 程序。使用 Netbeans IDE 7.1

arrays - 为什么++ : operator in the Scala language so strange?

c - 在 while 循环内使用 scanf 读取数组时出现意外行为

java - 在黑莓中创建类似于邮件应用程序的分组 TableView

java - 带 JXLS 2 的 SXSSF 变压器

php - AJAX 全局数组存储

java - 尝试重新绘制 jpanel