Java是按值传递还是按引用传递? Java是pass by value 还是 pass by reference?这是一个Java面试中常见的问题。
对于原始类型(primitive type也译为值类型),是通过拷贝一个相同的值传给java方法的参数的;而对于引用类型(reference type),就是对象,是通过拷贝一个相同的引用或地址传给java方法的参数的。业界都统称这是pass-by-value(值传递)。
1.什么是值传递
值传递指的就是是在方法调用时,传递的参数是按值的拷贝传递
public static void main(String[] args) { int number1 = 10; int number2 = 20; swap(number1, number2); System.out.println(number1); // 10 System.out.println(number2); // 20 } public static void swap(int a, int b) { int t = a; a = b; b = t; }
2.什么是引用传递
引用传递,指的是在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,就是变量所对应的内存空间的地址。
public static void main(String[] args) { int number1 = 10; int number2 = 20; int[] result = swap2(number1, number2); number1 = result[0]; number2 = result[1]; System.out.println(number1); // 20 System.out.println(number2); // 10 } public static int[] swap2(int a, int b) { int t = a; a = b; b = t; return new int[] {a, b}; }
搞清楚了这两种传递的内涵之后我们再来思考有些人说的那句:“在Java里面参数传递都是按值传递”。
这句话的意思其实应该是:按值传递是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称为“按值传递”。