java中main方法中声明的变量

java中main方法中声明的变量,java,variables,scope,static,main,Java,Variables,Scope,Static,Main,这应该与作用域有关,但我仍然不理解变量发生了什么 为了练习,我在课堂上做了三种方法,其中包括一种主要方法。在main方法中,我声明了两个用于试验的变量:arr1和a。另外,我声明了两个变量来与原始变量(arr1和a)进行比较:sorted和b。 然后,我尝试使用我实现的printq方法打印数组,以查看前后的区别。 ^ 这是我尝试的主要方法 public int[] insertionSort(int[] arr) { int min, temp; for (int

这应该与作用域有关,但我仍然不理解变量发生了什么

为了练习,我在课堂上做了三种方法,其中包括一种主要方法。在main方法中,我声明了两个用于试验的变量:arr1和a。另外,我声明了两个变量来与原始变量(arr1和a)进行比较:sorted和b。
然后,我尝试使用我实现的printq方法打印数组,以查看前后的区别。

^ 这是我尝试的主要方法

    public int[] insertionSort(int[] arr) {
    int min, temp;
    for (int i = 0; i < arr.length - 1; i++) {
        min = i;
        for (int j = i + 1; j < arr.length; j++) {
            if (arr[j] < arr[min]) {
                min = j;
            }
        }
        temp = arr[i];
        arr[i] = arr[min];
        arr[min] = temp;
    }
    return arr;
}
public void printq(int[] a) {
    if (a == null) {
        System.out.println("[]");
    } else {
        String temp = "[";
        for (int i = 0; i < a.length - 1; i++) {
            temp = temp + a[i] + ", ";
        }
        temp = temp + a[a.length - 1] + "]";
        System.out.println(temp);
    }
}
public int[] changeValue(int[] c) {
    for (int i = 0; i < c.length; i++) {
        c[i] = i + 1;
    }
    return c;
}
尽管main方法中声明的变量不是静态变量,但这个示例显示一个变量似乎受到另一个变量的影响。

我试图从访问修饰符和作用域的角度来理解这一点,但我最终还是发布了这一点,因为我仍然不明白为什么int数组arr1和sorted在末尾有相同的数组。

有人能解释一下这段代码是如何工作的吗?

为了避免发送原始对象数据的引用,您可以发送其克隆(复制)对象数据的引用

    public static void main(String[] args) {
// TODO Auto-generated method stub
Main main = new Main();
int[] arr1 = new int[]{29, 64, 73, 34, 20};
int[] a = new int[]{2, 2, 2};
//sorted and b would now point to the cloned data of arr1 and a respectively
int[] sorted = insertionSort(arr1.clone());
int[] b = changeValue(a.clone());
main.printq(arr1);
main.printq(sorted);
main.printq(a);
main.printq(b);

}

您应该阅读以理解为什么这段代码是这样工作的。java中的概念存在误解,java总是按值传递。这些链接真的很有用!非常感谢,谢谢!这对于理解如何将数组作为参数传递给方法非常有帮助。我认为Java总是按值传递,所以我甚至不能认为参数可以是具有数组引用的值。
main.printq(arr1) prints [20, 29, 34, 64, 73]. (supposed to be [29, 64, 73, 34, 20]) 
main.printq(sorted) prints [20, 29, 34, 64, 73] as well. (as I expected) 
main.printq(a) prints [1, 2, 3]. (supposed to be [2, 2, 2])
main.printq(b) prints [1, 2, 3]. (as I expected)
    public static void main(String[] args) {
// TODO Auto-generated method stub
Main main = new Main();
int[] arr1 = new int[]{29, 64, 73, 34, 20};
int[] a = new int[]{2, 2, 2};
//sorted and b would now point to the cloned data of arr1 and a respectively
int[] sorted = insertionSort(arr1.clone());
int[] b = changeValue(a.clone());
main.printq(arr1);
main.printq(sorted);
main.printq(a);
main.printq(b);