Java数组参数传值是指在Java中,当一个方法被调用时,实参会被复制一份给形参,这样就会产生两份不同的内存空间,实参和形参之间的值是独立的。
Java中的数组也是一样,当一个数组作为参数传递到方法中时,它也会被复制一份给形参。但是由于数组本身是引用类型,所以实际上复制的是引用而不是整个数组。因此,实参和形参拥有相同的引用地址(即拥有相同的内存地址)。
public class Test { public static void main(String[] args) { int[] arr = {1,2,3}; System.out.println("Before change:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } change(arr); // 这里将arr作为参数传递到change()方法中 System.out.println("\nAfter change:"); for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } public static void change(int[] arr) { // 定义change()方法,将arr作为参数传入 for (int i = 0; i < arr.length; i++) { if (arr[i] % 2 == 0) { arr[i] *= 2; } else { arr[i] *= 3; } } } // 由于arr作为引用传入change()方法中,所以change()方法对arr进行修改后(即修改了内存地址中的内容);main()方法中的arr也随之改变。 // 因此main()方法中打印出来的arr已经被修改过了。 // 这就说明了Java中使用引用来传递数组时实际上是将引用复制一份给形参。 // 因此实际上实参和形参之间共享同一片内存区域。 // 此时改动其中一者都会对其余者造成影响。
我们可以将数组作为参数传递给方法或构造函数。
我们传递给该方法的数组的类型必须是与形式参数类型兼容的赋值。
以下代码显示了如何将Array作为方法参数传递。
public class Main { public static void main(String[] args) { int[] num = { 1, 2 }; System.out.println("Before swap"); System.out.println("#1: " + num[0]); System.out.println("#2: " + num[1]); swap(num); System.out.println("After swap"); System.out.println("#1: " + num[0]); System.out.println("#2: " + num[1]); } public static void swap(int[] source) { if (source != null && source.length == 2) { // Swap the first and the second elements int temp = source[0]; source[0] = source[1]; source[1] = temp; } } }
上面的代码生成以下结果。
因为数组是一个对象,所以它的引用的副本被传递给一个方法。
如果方法更改数组参数,实际参数不受影响。
import java.util.Arrays; public class Main { public static void main(String[] args) { int[] origNum = { 1, 2, 3 }; System.out.println("Before method call:" + Arrays.toString(origNum)); // Pass the array to the method tryArrayChange(origNum); System.out.println("After method call:" + Arrays.toString(origNum)); } public static void tryArrayChange(int[] num) { System.out.println("Inside method-1:" + Arrays.toString(num)); // Create and store a new int array in num num = new int[] { 10, 20 }; System.out.println("Inside method?2:" + Arrays.toString(num)); } }
上面的代码生成以下结果。
存储在数组参数的元素中的值可以在方法中始终更改。
以下代码显示了如何更改方法中的数组参数的元素。
import java.util.Arrays; public class Main { public static void main(String[] args) { int[] origNum = { 1, 2, 3 }; String[] origNames = { "Java", "SQL" }; System.out.println("Before method call, origNum:" + Arrays.toString(origNum)); System.out.println("Before method call, origNames:" + Arrays.toString(origNames)); // Call methods passing the arrays tryElementChange(origNum); tryElementChange(origNames); System.out.println("After method call, origNum:" + Arrays.toString(origNum)); System.out.println("After method call, origNames:" + Arrays.toString(origNames)); } public static void tryElementChange(int[] num) { if (num != null && num.length > 0) { num[0] = -1; } } public static void tryElementChange(String[] names) { if (names != null && names.length > 0) { names[0] = "T"; } } }
上面的代码生成以下结果。
以下代码显示如何更改对象数组元素。
class Item { private double price; private String name; public Item(String name, double initialPrice) { this.name = name; this.price = initialPrice; } public double getPrice() { return this.price; } public void setPrice(double newPrice) { this.price = newPrice; } public String toString() { return "[" + this.name + ", " + this.price + "]"; } } public class Main { public static void main(String[] args) { Item[] myItems = { new Item("Pen", 2.11), new Item("Pencil", 0.10) }; System.out.println("Before method call #1:" + myItems[0]); System.out.println("Before method call #2:" + myItems[1]); // Call the method passing the array of Item tryStateChange(myItems); System.out.println("After method call #1:" + myItems[0]); System.out.println("After method call #2:" + myItems[1]); } public static void tryStateChange(Item[] allItems) { if (allItems != null && allItems.length > 0) { allItems[0].setPrice(0.38); } } }
上面的代码生成以下结果。
Java数据类型教程 -Java double数据类型double数据类型使用64位来存储浮点数。double值也称为双精度浮点数。它可以表示数量小到4...
Java数据类型教程 -Java int数据类型int数据类型是32位有符号Java原语数据类型。int数据类型的变量需要32位内存。其有效范围为-2...
Java 实例 - 字符串替换 Java 实例如何使用java替换字符串中的字符呢?以下实例中我们使用 java String 类的 replace 方法来替换...
Java 实例 - 数组获取最大和最小值 Java 实例以下实例演示了如何通过 Collection 类的 Collection.max() 和 Collection.min() 方...
Java 实例 - 字符串小写转大写 Java 实例以下实例使用了 String toUpperCase() 方法将字符串从小写转为大写://StringToUpperCas...