Java 值传递与引用传递注意事项
-
值传递:即参数为基本数据类型,形参改变不会改变实参
public class Main { public static void main(String[] args) { Tool t = new Tool(); int a = 1, b = 100; System.out.println(a + "\t" + b);//输出1 100 //调用方法,在栈中开辟空间运行,两形参进行交换,实参不变 t.swap(a, b); System.out.println(a + "\t" + b);//输出1 100 } } class Tool { public void swap(int a, int b) { //交换a,b的值 a = a ^ b; b = a ^ b; a = a ^ b; }
-
引用传递:即参数为引用类型(数组、对象等),形参改变可以改变实参,也可以不改变实参
-
改变实参:
public class Main { public static void main(String[] args) { Tool t = new Tool(); //堆中开辟数组 int[] arr = {1, 2, 3}; System.out.println(arr[0]);//输出1 //调用方法,在栈中开辟空间,形参指向堆中数组,同时修改 //堆中数组 t.alterArr(arr); System.out.println(arr[0]);//输出1000 } } class Tool { public void alterArr(int[] arr) { arr[0] = 1000; } }
-
不改变实参:
public class Main { public static void main(String[] args) { Tool t = new Tool(); Person p = new Person(); //初始化对象 p.name = "李华"; p.age = 18; System.out.println(p.age);//输出18 //调用方法,在栈中开辟空间,形参虽指向空,但并未修改堆 //中对象数据 t.alter(p); System.out.println(p.age);//输出18,并非抛出异常 } } class Tool { public void alter(Person p) { p = null;//令p指向空 } } class Person { String name; int age; }
-