使用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
這裏能夠看出,方法不能夠改變基本類型參數,而做爲引用參數則不一樣對象
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
上述是改變對象狀態(屬性)的方法,但引用自己卻沒法改變(容易搞錯的地方)同步
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版)》給出的結論是: