当我运行此代码时,它会输出0,1,2,但我不知道为什么。你能解释一下吗?
public void run() {
int[] arr = new int [3];
for(int i=0; i<arr.length;i++){
arr[i]=i;
}
domore(arr);
for(int i=0; i<arr.length;i++){
println(arr[i]);
}
}
private void domore(int[] arr) {
// TODO Auto-generated method stub
int [] att = new int [3];
for(int i=0; i<att.length;i++){
att[i]=77;
}
arr=att;
}
答案 0 :(得分:8)
在Java中 - “对象的引用按值传递”。您在doMore()方法中所做的任何更改都不会反映在原始数组中,因为您正在重新分配传递的引用...(请使用camelCase命名方法/字段。即,使用doMore()而不是domore)。
public void run() {
int[] arr = new int [3]; // arr points to an integer array of size 3
doMore(arr);
}
private static void doMore(int[] arrNew) { // arrNew is copy of arr so it also points to the same integer array of size 3. So, any changes made by arrNew are as good as changes made by arr (and yes data of arr is changed..)
// TODO Auto-generated method stub
int [] arrNew = new int [3]; // you are making arrNew point to new integer array of size 3. So, now arrNew points to a new object and not to the one pointed by arr.
for(int i=0; i<arrNew.length;i++){
arrNew[i]=77;
}
}
答案 1 :(得分:3)
在方法中domore
int[] arr
作为参数传递,意味着传递了引用的副本(也就是值)。在该方法中,创建新的int[]
,然后将其分配给引用的副本(int[] arr
)。这永远不会更改int[]
方法中创建的初始run
。它只会将传递的参数分配给domore()
中新创建的数组。
答案 2 :(得分:1)
因为您要将arr
- 数组的引用添加到方法domore
中。在其中,您可以通过设置arr=att
来减少此参考。外部方法run
无法识别此新设置的引用,并且将保留旧的数组引用,其中包含值0, 1, 2
。
答案 3 :(得分:1)
尝试在domode方法中返回数组arr
public void run() {
int[] arr = new int [3];
for(int i=0; i<arr.length;i++){
arr[i]=i;
}
arr = domore(arr);
for(int i=0; i<arr.length;i++){
println(arr[i]);
}
}
private int[] domore(int[] arr) {
// TODO Auto-generated method stub
int [] att = new int [3];
for(int i=0; i<att.length;i++){
att[i]=77;
}
return(att);
}
答案 4 :(得分:0)
domore是一个无效函数。如果你不想改变你的价值观,你将不得不归还一些东西。
private int[] domore (int[] arr){
int [] att = new int [3];
for(int i=0; i<att.length;i++){
att[i]=77;
}
return att;
}
你叫它:
arr = domore(arr);
答案 5 :(得分:0)
您正在使用一组基元。如果您将int
更改为Integer
(从基元更改为对象),则不应该出现此问题。
int a=5;
int b=a;
b=10;
- &gt; a仍然是5。 如果你想使用原语,那么只需返回int数组并将其分配给初始数组
arr=doMore(arr);
答案 6 :(得分:0)
当您在函数中传递任何参数值时,该范围仅对该函数是本地的。
另一件事是,在java中,你是按值而不是通过引用来调用函数。
如果要使用修改后的值,则必须return
来自函数。
public void run() {
int[] arr = new int [3];
for(int i=0; i<arr.length;i++){
arr[i]=i;
}
// arr is in run() method
domore(arr);
for(int i=0; i<arr.length;i++){
System.out.println(arr[i]);
}
}
private void domore(int[] arr) {
// TODO Auto-generated method stub
int [] att = new int [3];
for(int i=0; i<att.length;i++){
att[i]=77;
}
arr=att; // here scope of arr is local for domore() method only
// so arr in run() method will not modified.
}
答案 7 :(得分:-1)
使用 arr =(int [])att.clone();或者你也可以使用Array.copyOf方法!!!
而不是arr = att