许多编程语言中有两种参数传递的方法进行选择:值传递和引用传递。

        (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);
	}
	
}

 

java函数传值引用 java值传递与引用类型传递_java

从上边的程序中可以验证之前的结论:

①形参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]);
	}

}

java函数传值引用 java值传递与引用类型传递_引用传递_02