Java中的值傳遞和引用傳遞
當一個物件被當作引數傳遞到一個方法後,此方法可改變這個物件的屬性,並可返回變化後的結果,那麼這裡到底是值傳遞還是引用傳遞?
答:是值傳遞。Java 程式語言只有值傳遞引數。當一個物件例項作為一個引數被傳遞到方法中時,引數的值就是該物件的引用一個副本。指向同一個物件,物件的內容可以在被呼叫的方法中改變,但物件的引用(不是引用的副本)是永遠不會改變的。
Java引數,不管是原始型別還是引用型別,傳遞的都是副本(有另外一種說法是傳值,但是說傳副本更好理解吧,傳值通常是相對傳址而言)。
如果引數型別是原始型別,那麼傳過來的就是這個引數的一個副本,也就是這個原始引數的值,這個跟之前所談的傳值是一樣的。如果在函式中改變了副本的 值不會改變原始的值.
如果引數型別是引用型別,那麼傳過來的就是這個引用引數的副本,這個副本存放的是引數的地址。如果在函式中沒有改變這個副本的地址,而是改變了地址中的 值,那麼在函式內的改變會影響到傳入的引數。如果在函式中改變了副本的地址,如new一個,那麼副本就指向了一個新的地址,此時傳入的引數還是指向原來的 地址,所以不會改變引數的值。
如果你想學習Java可以來這個群,首先是五三二,中間是二五九,最後是九五二,裡面有大量的學習資料可以下載。
例:
1 public class ParamTest { 2 public static void main(String[] args){ 3 /** 4 * Test 1: Methods can`t modify numeric parameters 5 */ 6 System.out.println("Testing tripleValue:"); 7 double percent = 10; 8 System.out.println("Before: percent=" + percent); 9 tripleValue(percent); 10 System.out.println("After: percent=" + percent); 11 12 /** 13 * Test 2: Methods can change the state of object parameters 14 */ 15 System.out.println(" Testing tripleSalary:"); 16 Employee harry = new Employee("Harry", 50000); 17 System.out.println("Before: salary=" + harry.getSalary()); 18 tripleSalary(harry); 19 System.out.println("After: salary=" + harry.getSalary()); 20 21 /** 22 * Test 3: Methods can`t attach new objects to object parameters 23 */ 24 System.out.println(" Testing swap:"); 25 Employee a = new Employee("Alice", 70000); 26 Employee b = new Employee("Bob", 60000); 27 System.out.println("Before: a=" + a.getName()); 28 System.out.println("Before: b=" + b.getName()); 29 swap(a, b); 30 System.out.println("After: a=" + a.getName()); 31 System.out.println("After: b=" + b.getName()); 32 } 33 34 private static void swap(Employee x, Employee y) { 35 Employee temp = x; 36 x=y; 37 y=temp; 38 System.out.println("End of method: x=" + x.getName()); 39 System.out.println("End of method: y=" + y.getName()); 40 } 41 42 private static void tripleSalary(Employee x) { 43 x.raiseSalary(200); 44 System.out.println("End of method: salary=" + x.getSalary()); 45 } 46 47 private static void tripleValue(double x) { 48 x=3*x; 49 System.out.println("End of Method X= "+x); 50 } 51 }
顯示結果:
Testing tripleValue: Before: percent=10.0 End of Method X= 30.0 After: percent=10.0 Testing tripleSalary: Before: salary=50000.0 End of method: salary=150000.0 After: salary=150000.0 Testing swap: Before: a=Alice Before: b=Bob End of method: x=Bob //可見引用的副本進行了交換 End of method: y=Alice After: a=Alice //引用本身沒有交換 After: b=Bob
相關文章
- Java的值傳遞和引用傳遞Java
- 值傳遞和引用傳遞
- JavaScript的值傳遞和引用傳遞JavaScript
- java方法中只有值傳遞,沒有引用傳遞Java
- Java - 是值傳遞還是引用傳遞Java
- 值傳遞與引用傳遞
- Java 從陣列來看值傳遞和引用傳遞Java陣列
- Day30--值傳遞和引用傳遞
- js中函式引數值傳遞和引用傳遞JS函式
- 關於值傳遞和引用傳遞的解釋
- 解惑4:java是值傳遞還是引用傳遞Java
- 快速搞懂值傳遞與引用傳遞
- ES5中的值傳遞/引用傳遞--解釋
- 這一次,徹底解決Java的值傳遞和引用傳遞Java
- 面試官問:Go 中的引數傳遞是值傳遞還是引用傳遞?面試Go
- 這一次,讓你徹底理解Java的值傳遞和引用傳遞!Java
- C#程式設計引用型別和值型別 以及引用傳遞和值傳遞C#程式設計型別
- Java引數傳遞是傳值還是傳引用?Java
- Java是值傳遞還是引用傳遞,又是怎麼體現的Java
- [精]--這一次,讓你徹底明白Java的值傳遞和引用傳遞!Java
- golang工作筆記(二)值傳遞與引用傳遞Golang筆記
- JS是按值傳遞還是按引用傳遞?JS
- java值傳遞Java
- go 值傳遞和地址傳遞的例子Go
- chan中傳遞map資料,傳遞的是引用
- C#|.net core 基礎 - 值傳遞 vs 引用傳遞C#
- js函式引數值傳遞和引用傳遞簡單介紹JS函式
- 面試官:兄弟,說說Java到底是值傳遞還是引用傳遞面試Java
- 偽命題:Java傳遞的值還是引用?Java
- 搗漿糊的老話題:Java是按值傳遞還是按引用傳遞Java
- PHP中物件的引用傳遞PHP物件
- Java只有值傳遞Java
- Python的函式引數傳遞:傳值?引用?Python函式
- c++指標傳遞與引用傳遞C++指標
- 07 引用 指標 和傳遞指標
- html、php和js值的傳遞(使用ajax進行傳遞)HTMLPHPJS
- Go語言引數傳遞是傳值?還是傳引用 ?Go
- Go語言引數傳遞是傳值還是傳引用Go