Java中奇怪的数组行为

Java中奇怪的数组行为,java,arrays,repaint,Java,Arrays,Repaint,我最近一直在做一些Java编码,遇到了这个非常奇怪的问题。我用Java编写了一个类,它扩展了JPanel并根据对象的大小调整对象的大小 为了更好地理解,我将问题简化为尽可能小的代码 问题是,当我运行下面的代码时,它总是不仅设置array1[0],而且还设置array2[0]。我不明白为什么array2会改变,即使我从未改变过它 我添加了一点来强调我认为代码所做的操作,但我看不到 当我运行代码并调整窗口的大小时,打印出来的值会迅速变化,并且在稍微移动后会无限大 import java.awt.Bo

我最近一直在做一些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);
    }
}
导入java.awt.BorderLayout;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
公共类Beispel扩展到JPanel{
双[]阵列1,阵列2;
公共贝斯皮尔(双[]阵列){
阵列1=阵列;
array2=数组;
}
公共无效重绘(){
试一试{
array1[0]=array2[0]*this.getWidth();
System.out.println(array2[0]);

//array2[0]=array1[0]而不是这样做

public Beispiel(double[] array){
    array1 = array;
    array2 = array;
}
尝试这样做并分享结果

public Beispiel(double[] array){
    array1 = Arrays.copyOf(array, array.length);
    array2 = Arrays.copyOf(array, array.length);
}

array2
确实会更改。当您使用
array1=array
array2=array
时,您正在使
array1
array2
引用相同的数组。因此对
array1
所做的任何更改也将反映在
array2


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

您知道对象和引用之间的区别吗?我已删除了“已解决”从标题上看。你已经接受了答案这一事实足以说明你的问题已经得到了解决。array.clone正在进行浅层复制吗?根据it的说法。我已经对你投了赞成票,但你最好在你的帖子中指出,如果你不介意的话,非常感谢,@Tyler Osborne刚刚发布了相同的解决方案,显然,我对变量是如何传递的没有正确的感觉,我想我现在明白了,谢谢大家!@frozn,但TNT用最好的方式解释了这一点。哦,我的上帝,这很好!!非常感谢,我只是在我的主代码上试过,它似乎运行得很好。我试图提高投票率,但不幸的是,我似乎需要“声誉”因为这是我的第一个问题,所以我没有得到的分数,抱歉。那么我的变量array1和array2是否回到了参数“array”,它们都是共享的,这就是为什么它们同时改变的原因?非常感谢!是的,我不能给你指官方文档或任何东西,但这是直接从persona开始的我的经验。我在做opengl模型渲染时必须处理这个问题,每次迭代时它都会改变模型的点。最后做了这个,效果很好:)将它设置为答案,以便其他人可以发现它有用。刚刚做了,我还在探索这里的控件xD,再次感谢:D