这应该与作用域简单相关,但是我仍然不了解变量的含义。
为了进行练习,我在课堂上做了三种方法,其中包含一种主要方法。在main方法内部,我声明了两个用于试验的变量:arr1和a。另外,我声明了两个变量与原始变量(arr1和a)进行比较:sorted和b。
然后,我尝试使用实现的printq方法来打印数组,以查看之前和之后之间的区别。
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};
int[] sorted = main.insertionSort(arr1);
int[] b = main.changeValue(a);
main.printq(arr1);
main.printq(sorted);
main.printq(a);
main.printq(b);
}
^ 这是我尝试的主要方法。
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.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)
即使main方法中声明的变量不是静态变量,此示例也表明一个似乎受到另一个的影响。
我试图了解与访问修饰符和范围有关的内容,但最终还是发布了此内容,因为我仍然不明白为什么int数组arr1和sorted的末尾具有相同的数组。
有人可以解释这段代码是如何工作的吗?
答案 0 :(得分:1)
为避免发送原始对象数据的引用,您可以发送其克隆(复制)对象数据的引用。
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);
}
答案 1 :(得分:0)
在您的public int[] insertionSort(int[] arr)
和public int[] changeValue(int[] c)
中,您正在修改作为参数传递的原始数组,因为数组是通过引用传递的。