最近重讀Java核心技術,不得不說的是這本書確實不錯。雖然本人不太喜歡做筆記,但還是覺得某些重要的地方必須要記一下。
關於方法參數調用一般有兩種:值調用(call by value)和引用調用(call by reference)。顧名思義,值調用表示方法接收的是調用者提供的值;引用調用表示方法接收的是調用者提供的變量的地址。
特別重要的是:在Java中,程序設計總是採用值調用。即:方法得到的是所有參數值得一個拷貝,方法不能修改傳遞給它的任何參數變量的內容。
這裏用一個例子來說明,如下代碼:
public class TestMP {
public static void main(String[] args) {
System.out.println("=== 測試基本數據類型 ===");
int a = 30;
System.out.println("調用前 a=" + a);
tripValue(a);
System.out.println("調用後 a=" + a);
System.out.println();
System.out.println("=== 測試對象引用參數 ===");
Book ba = new Book("Java核心技術", 30);
Book bb = new Book("算法技術手冊", 20);
System.out.println("調用前");
System.out.println(ba);
System.out.println(bb);
System.out.println();
System.out.println("對象引用類型參數調用可以改變對象內容");
adjustPrice(ba);
System.out.println(ba);
System.out.println();
System.out.println("對象引用類型參數調用不能改變參數引用值");
swapBook(ba, bb);
System.out.println(ba);
System.out.println(bb);
}
static void tripValue(int data) { // doesn't work
data = data * 3;
}
static void adjustPrice(Book aBook) {
aBook.setPrice(100.0);
}
static void swapBook(Book x, Book y) { // doesn't work
Book temp = x;
x = y;
y = temp;
}
}
class Book {
private String name;
private double price;
public Book(String name, double price) {
this.name = name;
this.price = price;
}
public void setPrice(double p) {
this.price = p;
}
//
@Override
public String toString() {
return "[name=" + this.name + ", price=" + this.price + "]";
}
}
這段程序輸出如下:
=== 測試基本數據類型 ===調用前 a=30
調用後 a=30
=== 測試對象引用參數 ===
調用前
[name=Java核心技術, price=30.0]
[name=算法技術手冊, price=20.0]
對象引用類型參數調用可以改變對象內容
[name=Java核心技術, price=100.0]
對象引用類型參數調用不能改變參數引用值
[name=Java核心技術, price=100.0]
[name=算法技術手冊, price=20.0]
總結一下:
- Java程序設計中對象採用的不是引用調用,實際上,對象引用進行的是值傳遞。
- 一個方法不能修改一個基本數據類型的參數;
- 一個方法可以改變一個對象參數的狀態;
- 一個方法不能實現讓一個對象參數引用一個新的對象。