這是一個(gè)經(jīng)典的面試問(wèn)題,混淆了新手Java開(kāi)發(fā)人員。在這篇文章中,我將用例子和圖來(lái)演示:Java是按照值傳遞。
1. 一些定義
傳遞值:在存儲(chǔ)器中復(fù)制傳入的實(shí)際參數(shù)值。
傳遞引用:傳遞復(fù)制實(shí)際地址的副本。
Java 總是傳遞值。原始數(shù)據(jù)類型和對(duì)象引用都只是值。
2. 傳遞原始類型變量
因?yàn)镴ava是傳值的,所以不難理解下面的代碼不會(huì)交換任何值。
swap(Type arg1, Type arg2) {
Type temp = arg1;
arg1 = arg2;
arg2 = temp;
}
3.傳遞對(duì)象變量
Java通過(guò)引用來(lái)操作對(duì)象,所有的對(duì)象變量都是引用。但是,Java不會(huì)通過(guò)引用傳遞方法參數(shù),而是通過(guò)值。
問(wèn)題:為什么對(duì)象的成員值會(huì)可以改變?
代碼示例
代碼:
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";
}
}
由于原始和拷貝引用都指向相同對(duì)象,所以成員值會(huì)改變。
傳遞引用示意圖
輸出:
red
green