Java核心技術筆記—方法參數(值調用和引用調用)

最近重讀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程序設計中對象採用的不是引用調用,實際上,對象引用進行的是值傳遞。
    • 一個方法不能修改一個基本數據類型的參數;
    • 一個方法可以改變一個對象參數的狀態;
    • 一個方法不能實現讓一個對象參數引用一個新的對象。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章