Java 按值调用还是引用调用
按值调用指方法接收调用者提供的值,
按引用调用指方法接收调用者提供的变量地址。
Java的参数传递,不管是基本数据类型还是引用类型的参数,都是按值传递,没有按引用传递!
Java 总是按值调用,方法得到的是所有参数值的副本,传递对象时实际上方法接收的是对象引用的副本。
-
方法不能修改基本数据类型的参数,
如果传递了一个 int 值 ,改变值不会影响实参,因为改变的是值的一个副本。 -
可以改变对象参数的状态,但不能让对象参数引用一个新的对象。因为他传入的是地址的副本
也就是传递的对象,重新让他指向一个新对象是不会改变原本的实参的,只有直接修改那个对象的内容才会改变
如果传递了一个 int 数组,改变数组的内容会影响实参,而改变这个参数的引用并不会让实参引用新的数组对象。
public class Test {
public static void main(String[] args) {
int[] a = {1,2,3};
update4(a);
for (int i : a){
System.out.print(i);
}
User user = new User("张三");
up2(user);
System.out.println(user.getName());
}
public static void up(User user){
user = new User("李四"); // 还是张三
}
public static void up2(User user){
user.setName("李四"); // 改变成李四
}
public static void update(int[] a){
int[] b = {3,4,5};
a = b; // 不变
}
public static void update2(int[] a){
a = new int[]{3, 4, 5}; // 不变
}
public static void update3(int[] a){
int k = 0;
for (int i : a){
i = 3 + k; // 不变
k++;
}
}
public static void update4(int[] a){
a[0] = 9; // 内容改变
}
}