还记得我们前两天学的方法吗?结合昨天学的阵列,阵列也可以用在方法里传递吗?
当然可以罗!我们就先来看个例子:
public class PassArray {
public static void main(String[] args){
int[] arr = {1, 2, 3, 4, 5};
System.out.print("Original array:");
for(int number : arr){
System.out.printf(" %d", number);
}
System.out.println();
doubleArray(arr);
System.out.print("After double array:");
for(int number : arr){
System.out.printf(" %d", number);
}
System.out.println();
System.out.printf("Original 3rd element: %d%n", arr[2]);
doubleElement(arr[2]);
System.out.printf("After double 3rd element: %d%n", arr[2]);
}
public static void doubleArray(int[] array){
for(int i = 0 ; i < array.length ; i++){
array[i] *= 2;
}
}
public static void doubleElement(int element){
element *= 2;
}
}
Original array: 1 2 3 4 5
After double array: 2 4 6 8 10
Original 3rd element: 6
After double 3rd element: 6
我们可以看到,在 doubleArray() 这个方法中,参数列是一个整数阵列,main 程序中的阵列经过这个方法後,印出来的阵列变成 2 倍。此时阵列变成 2、4、6、8、10,因此可以得知,我们在 doubleArray() 修改阵列值,在 main 程序的值也被更新了。
你觉得很合理吗?那麽接着我们往下看,我们再将阵列元素第三个也就是索引值为 2 的元素 double,前後印出的结果竟然都是 6,double 完应该要是 12 不是吗?
在许多程序语言中,方法在传递引数有分为传值呼叫(pass-by-value/call-by-value)和传址呼叫(pass-by-reference/call-by-reference)。传值呼叫就像是 doubleElement() 所表现的,在 main 中我传递 arr[2] 的「值」,也就是 6 给 doubleElement() 里的 element,此时 element 是 arr[2] 的副本,他们具有同样的值,但不是同一个东西,所以 element 乘 2 时会变成 12,但是 arr[2] 中的元素并不会被更改到值。
Java 所有的引数都是传值呼叫。虽然在 doubleArray() 中看起来和前面的不一样,好像应该是传址呼叫,但这是 Java 与其他程序语言不同的地方。阵列是一个物件(详细的物件介绍之後会说明),为了增进效能(不然每一个阵列元素都必须建立一个副本),main 中的 arr 和 doubleArray() 中的 array 会指向同一块记忆体。因此在修改 doubleArray() 中的 array 元素时,main 中的 arr 也会因为参考到同一块记忆体,而取得同样的值,最後再次强调 Java 所有的引数都是传值呼叫。
为了让大家可以消化,最後在讲一个平易近人的「多维阵列」就好
目前为止介绍的都是一维阵列,也就是一般常见的排队排成一列,但看电影可以有音效和丰富的剧情,甚至可以是 3D 的,阵列当然也可以 XD。
int[][] arr = new int[2][3]; //2 个 row,每个 row 3 个 elements
当然也可以直接给值,且不同长度:
int[][] arr = {{1, 2} , {3, 4, 5}}
今天的东西有点玄,但还是希望大家能吸收,所以就把剩下的东西留到明天了,继续加油吧!
<<: Day 12「可恶想要」单元测试、Code Smell 与重构 - Feature Envy 篇
<!DOCTYPE html> <html lang="en"...
今天讲解的是 CAP 定理 DAY05_CAP定理 ...
这个的前一篇是~https://ithelp.ithome.com.tw/articles/1024...
在疫情爆发之前,一切的一切看似都非常的正常,但是在爆发之後,所有的一切都被疫情给打乱了,并且所有的秩...
今天开始来打一题 Try Hack Me 的题目吧!这一题可以学习到几种常见的暴力破解相关技术。 题...