「按…………調用」(call by)是一個標準的計算機科學術語,用來描述各類程序設計語言中方法參數的傳遞方式。java
方法參數的傳遞方式:程序員
方法能夠修改按引用傳遞的變量的值,而不能修改按值傳遞的變量的值。ide
Java 程序設計語言老是採用按值調用。也就是說,方法獲得的是全部參數值的一個副本。具體講,方法不能修改傳遞給它的任何參數變量的內容。ui
public class ParamTest { public static void tripleValue(double x) { x = 3 * x; System.out.println("方法結束時,x = " + x); } public static void main(String[] args) { double x = 10; System.out.println("調用方法前,x = " + x); ParamTest.tripleValue(x); System.out.println("調用方法後,x = " + x); } }
打印結果:this
調用方法前,x = 10.0 方法結束時,x = 30.0 調用方法後,x = 10.0
一個方法不可能修改一個基本數據類型的參數。
實現一個改變對象參數狀態的方法徹底是能夠的,也至關常見。理由很簡單,方法獲得的是對象引用的副本,原來的對象引用和這個副本都是同一個對象。設計
有些程序員認爲 Java 程序設計語言對對象採用的是按引用調用,實際上,這種理解是不對的。下面是一個反例。code
import java.util.Objects; public class ParamTest { public static void swap(Employee x, Employee y) { Employee temp = x; x = y; y = temp; } public static void main(String[] args) { Employee a = new Employee("A", 10000); Employee b = new Employee("B", 5000); System.out.println(a); System.out.println(b); // A 的工資增長 200% a.raiseSalary(200); // 交換 a 和 b 的對象 ParamTest.swap(a, b); System.out.println("調用 Employee 對象交換方法後"); System.out.println(a); System.out.println(b); } } class Employee { private String name; private double salary; public Employee(String name, double salary) { Objects.requireNonNull(name, "The name cannot be null"); this.name = name; this.salary = salary; } /** * 增長工資 * @param byPercent 百分比 */ public void raiseSalary(double byPercent) { double raise = salary * byPercent / 100; salary += raise; } public String getName() { return name; } public double getSalary() { return salary; } public String toString() { String str = "%s[name=%s,salary=%s]"; return String.format(str, getClass(), name, salary); } }
打印結果:orm
class Employee[name=A,salary=10000.0] class Employee[name=B,salary=5000.0] 調用 Employee 對象交換方法後 class Employee[name=A,salary=30000.0] class Employee[name=B,salary=5000.0]
從執行的結果中能夠看到,變量 a 和變量 b 的對象沒有交換,這說明:Java 程序設計語言對對象採用的不是按引用調用。變量 a 的對象狀態發生了改變,說明,Java 程序設計語言對象方法參數能夠改變對象的狀態。
Java 程序設計語言對對象採用的不是引用調用,實際上,對象引用是按值傳遞的。對象
下面總結一下在 Java 中方法參數能作什麼和不能作什麼:ip