我最近做了一些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);
}
}
答案 0 :(得分:2)
array2
确实有所改变。当您使用array1 = array
和array2 = array
时,您正在使array1
和array2
引用相同的数组。因此,对array1
所做的任何更改也会反映在array2
中。
要解决此问题,请使用java.util.Arrays.copyOf(array, array.length)
或array.clone()
(请注意,这会返回数组的浅表副本)。
答案 1 :(得分:1)
而不是这样做,
public Beispiel(double[] array){
array1 = array;
array2 = array;
}
尝试这样做并分享结果
public Beispiel(double[] array){
array1 = Arrays.copyOf(array, array.length);
array2 = Arrays.copyOf(array, array.length);
}