Java 方法參數(學習 Java 編程語言 032)

1. 方法參數的傳遞方式

「按…………調用」(call by)是一個標準的計算機科學術語,用來描述各類程序設計語言中方法參數的傳遞方式。java

方法參數的傳遞方式:程序員

  • 按值調用(call by value)表示方法接收的是調用者提供的值。
  • 按引用調用(call by reference)表示方法接收的是調用者提供的變量地址。

方法能夠修改按引用傳遞的變量的值,而不能修改按值傳遞的變量的值。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

  • 方法不能修改基本數據類型的參數(即數值型或布爾型)
  • 方法能夠改變對象參數的狀態。
  • 方法不能讓一個對象參數引用一個新的對象。
相關文章
相關標籤/搜索