Java方法參數使用

使用Java工做很長時間了,最近閱讀《Java核心技術-卷I(第8版)》時,卻總能發現一些本身對Java錯誤的理解之處,今天要說的是關於Java方法參數使用部分(4.5節)。 小節開篇講到java

Java程序設計語言老是採用值調用。也就是說,方法獲得的是全部參數值的一個拷貝,特別是,方法不能修改傳遞給它的任何參數變量的內容。測試

下面給出一個例子來講明this

int number = 10 ;
System.out.println(number);	// 10		
triple(number);		        // 執行三倍操做
System.out.println(number);	// 10

暫時不用管triple方法實現是怎樣,能夠看出方法執行先後,number的值是沒有改變的,下面是triple方法的實現設計

private static final void triple(int x) {
	x = 3 * x ;
}

下面用圖說明整個過程(網上找到的圖都很模糊,這裏我本身從新畫了一個)
具體執行過程:code

  1. x被初始化爲number的一個拷貝。
  2. x被乘以3後等於30,但此時number自己還是10。
  3. 這個方法結束後,x的生命週期結束,值被丟棄。

這裏能夠看出,方法不能夠改變基本類型參數,而做爲引用參數則不一樣對象

public class Employee {

	private String name ;
	private double salary ;
	
	public Employee(String name ,double salary) {
		this.name = name ;
		this.salary = salary ;
	}
	
	public void setSalary(double salary) {
		this.salary = salary;
	}

	public double getSalary() {
		return salary;
	}

}

經過如下測試能夠看出引用對象的值發生了變化生命週期

Employee jane = new Employee("jane" ,1000) ;

System.out.println(jane.getSalary());	// 1000.0
		
triple(jane) ;	// 工資變動爲3倍
		
System.out.println(jane.getSalary());	// 3000.0

下面是triple方法的實現ip

public static final void triple(Employee e) {
	e.setSalary(e.getSalary() * 3);
}

一樣用圖說明
get

  1. e被初始化爲jane的值拷貝,這裏是一個對象引用,此時e引用了與jane所引用的實例。
  2. triple方法將e引用實例的的salary變動爲3倍。
  3. 方法結束後,e被丟棄。但其引用的實例的salary已提升爲原來的3倍,而jane仍引用着該實例。

上述是改變對象狀態(屬性)的方法,但引用自己卻沒法改變(容易搞錯的地方)同步

Employee jane = new Employee("jane" ,1000) ;
Employee john = new Employee("john" ,1200) ;

// com.zlikun.jee.Employee@578088c0
System.out.println(jane);
// com.zlikun.jee.Employee@37922221
System.out.println(john);
		
swap(jane, john);
		
// com.zlikun.jee.Employee@578088c0
System.out.println(jane);
// com.zlikun.jee.Employee@37922221
System.out.println(john);

下面給出swap方法的實現

static void swap(Employee e1 ,Employee e2) {
	Employee t = e1 ;
	e1 = e2 ;
	e2 = t ;
}

經過輸出結果能夠發現,交換先後,jane、john引用的實例並未發生變化。

以上測試,《Java核心技術-卷I(第8版)》給出的結論是:

  1. 一個方法不能修改一個基本數據類型的參數
  2. 一個方法能夠改變一個對象參數的狀態
  3. 一個方法不能實現讓對象引用一個新的對象

本文同步自:http://zlikun.com/java-method-arguments/

相關文章
相關標籤/搜索