这是一个经典的面试问题,混淆了新手Java开发人员。在这篇文章中,我将用例子和图来演示:Java是按照值传递。
1. 一些定义
传递值:在存储器中复制传入的实际参数值。
传递引用:传递复制实际地址的副本。
Java 总是传递值。原始数据类型和对象引用都只是值。
2. 传递原始类型变量
因为Java是传值的,所以不难理解下面的代码不会交换任何值。
swap(Type arg1, Type arg2) {
Type temp = arg1;
arg1 = arg2;
arg2 = temp;
}
3.传递对象变量
Java通过引用来操作对象,所有的对象变量都是引用。但是,Java不会通过引用传递方法参数,而是通过值。
问题:为什么对象的成员值会可以改变?
代码:
class Apple {
public String color="red";
}
public class Main {
public static void main(String[] args) {
Apple apple = new Apple();
System.out.println(apple.color);
changeApple(apple);
System.out.println(apple.color);
}
public static void changeApple(Apple apple){
apple.color = "green";
}
}
由于原始和拷贝引用都指向相同对象,所以成员值会改变。
输出:
red
green