许多编程语言中有两种参数传递的方法进行选择:值传递和引用传递。
(1)值传递:实参传递给形参的是值,形参和实参在内存上是两个独立的变量,对形参做任何修改都不会影响实参。
(2)引用传递:实参传递给形参的是实参的地址(或首地址),形参是实参的引用,实参和形参在内存上指向同一存储空间,对形参的修改会影响实参。
在Java中对于基本数据类型(byte、short、int、long、float、double、boolean、char)采用值传递。数组、对象(类)等引用数据类型采用的是引用传递,但是String类是一个特殊的类,采用值传递。(看了其他博主对java是值传递还是引用传递存在争议,这只是自己的一点理解,看到一篇文章写得挺好的,跟大家共享学习一下Java 到底是值传递还是引用传递? - 知乎)
package DataStructures;
public class Array_arrayRef {
public void ref(int a, int[] arr, String s) {
a = 2;
arr[0] = 2;
s = "world";
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Array_arrayRef t = new Array_arrayRef();
// 基本数据类型
int i = 1;
// 引用数据类型
int[] ar = new int[] {1,2,3};
// String类的引用
String str = new String("hello");
System.out.println("调用前");
System.out.println("int:" + i);
System.out.println("int[]:" + ar[0] + " " + ar[1] + " " + ar[2]);
System.out.println("String:" + str);
t.ref(i, ar, str);
System.out.println("调用后");
System.out.println("int:" + i);
System.out.println("int[]:" + ar[0] + " " + ar[1] + " " + ar[2]);
System.out.println("String:" + str);
}
}
从上边的程序中可以验证之前的结论:
①形参a和s是值传递,同i和str占用不同的存储空间,当改变形参的值时,实参的值不会被改变
②形参arr是引用传递,和实参ar指向同一存储空间,当改变形参的值时,实参的值也会被改变
Note:如果传入的是数组的元素,当改变形参的值时,实参的值不会被改变
package DataStructures;
public class Array_arrayRef1 {
public void ref1(int[] arr) {
arr[0] = 2;
}
public void ref2(int a) {
a = 2;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Array_arrayRef1 t = new Array_arrayRef1();
int[] ar1 = new int[] {1,2,3};
int[] ar2 = new int[] {1,2,3};
t.ref1(ar1);
System.out.println("传入数组:");
System.out.println("int[]:" + ar1[0] + " " + ar1[1] + " " + ar1[2]);
t.ref2(ar2[0]);
System.out.println("传入数组元素:");
System.out.println("int[]:" + ar2[0] + " " + ar2[1] + " " + ar2[2]);
}
}