Java **只有傳值**。基本類型傳值副本;引用類型傳引用地址副本(即「傳引用值」)。
public class VariableDemo {
public static void main(String[] args) {
int a = 1;
List<String> list = new ArrayList<>();
list.add("taoshihan1");
makeChange(a, list);
System.out.println(a); // 1 (未變)
System.out.println(list); // [taoshihan1, taoshihan2] (物件內容變)
}
static void makeChange(int a, List<String> list) {
a = 4; // 修改副本
list.add("taoshihan2"); // 修改物件內容
}
}
PHP 預設傳值,加 & 符號實現傳址:
<?php
function makeChange($a, &$arr) {
$a = 4;
array_push($arr, "taoshihan2");
}
$a = 1; $arr = ["taoshihan1"];
makeChange($a, $arr);
echo $a; // 1
print_r($arr); // ["taoshihan1", "taoshihan2"]
?>
| 語言 | 基本類型 | 引用類型 / 物件 | 傳址支援 |
|---|---|---|---|
| Java | 傳值副本 | 傳引用地址副本 | 不支援 (無 &) |
| PHP | 傳值副本 | 傳值副本 (複製物件) | 支援 &$var |
| C/C++ | 傳值 | 指標/引用傳址 | 原生支援 |
list = new ArrayList())不影響外部引用。