public class ABC {
public static void main(String args[]) {
int i[] = {1};
change_i(i);
System.out.println(i[0]); //prints 1
}
public static void change_i(int a[]) {
int j[]={3};
a=j;
}
}
public class ABC {
public static void main(String args[]) {
int i[] = {1};
change_i(i);
System.out.println(i[0]); //prints 3
}
public static void change_i(int a[]) {
int j[]={3};
a[0]=j[0];
}
}
这两项作业的实际差异是什么a=j;
和a[0]=j[0];
为什么输出会有所不同?
答案 0 :(得分:1)
1)a=j
使变量a
引用任何变量j
引用。这意味着,在执行语句之后, a
和j
引用相同的内容。
2)a[0]=j[0]
使数组a
的第一个元素(索引0)的值具有数组j
的第一个元素的值。意思是,在执行语句之后, a
的第一个元素和j
引用相同的内容
修改强>
就具体问题而言,在方法change_i
中,每个语句都会发生以下情况:
1)
public static void change_i(int a[]) { // pass the array a by value
int j[]={3}; // create a new array of integers with size 1 that holds the number 3 as its only element
a=j; // make this passed copy value of array a now point to j
}
Java按值(Look here for detail)传递所有内容,因此在执行方法change_i
后,没有任何更改。原因是a
方法中的变量change_i
用作传递给方法的数组a
的引用。执行语句a=j
后,此变量a
现在引用在方法内创建的数组j
,但不会影响传入的数组。只有更改的内容是 a
内的changes_i
引用
2)
public static void change_i(int a[]) { // pass the array a by value
int j[]={3}; // create a new array of integers with size 1 that holds the number 3 as its only element
a[0]=j[0]; // used the copy value of array a to access the first element of original array a and give it the value of the first element of array j, which is 3
}
此方法实际上改变了传入的数组。由于此方法中的变量a
引用了传入的数组,当我们调用a[0]
时,我们使用此复制的引用来访问原始数组的第一个元素,因此a[0]=j[0]
实际上改变了数组。
您应该阅读有关how Java passes values into methods的更多信息。