有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java中奇怪的数组行为

我最近一直在做一些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);
    }
}

共 (2) 个答案

  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);
    }
    
  2. # 2 楼答案

    array2确实发生了变化。当您使用array1 = arrayarray2 = array时,您使array1array2引用同一数组。因此,对array1所做的任何更改也将反映在array2

    要解决此问题,请使用java.util.Arrays.copyOf(array, array.length)array.clone()(请注意,这将返回数组的浅层副本)