Java方法的參數是按值傳遞的.

困擾多年的“值傳遞,引用傳遞”問題,今晚茅塞頓開!

轉載來自:http://nileader.blog.51cto.com/1381108/303501


在Java中,所有的方法參數,都是"按值傳遞".

有那麼一種說法,Java中基本類型是按值傳遞,對象是按引用傳遞.這個說法其實是不確切的,確切的說法是

Java中基本類型將值作爲參數,按值傳遞.對象將引用作爲參數,按值傳遞.

所謂按值傳遞,就是傳遞的是一個副本.

 

現在來解釋下Java方法傳遞引用時的情況.

比如說有一個引用 Body body = new Body(.....);

將body當作參數傳遞的時候,傳遞的不是body指向的對象,也不是body引用本身,而是body的一個副本,並且這個副本和body是一模一樣.  這裏的一模一樣就是body和副本指向同一個對象.

那麼當body的副本進入方法後,對這個副本的修改同樣會影響body.

但是如果進入方法後將body的副本指向其它對象的時候,那麼和body是一點關係都沒有了.

下面來看看程序就明白了.

  1. public class TestParam { 
  2.     public static void main(String[] args) { 
  3.         Body var1 = new Body(1); 
  4.         Body var2 = var1; 
  5.         doSomething( var2 ); 
  6.         System.out.println( var1.a ); 
  7.         System.out.println(var2.a); 
  8.         System.out.print(var1 == var2); 
  9.     } 
  10.  
  11.     public static void doSomething(Body body) { 
  12.         body.a = 2
  13.     } 
  14. class Body { 
  15.     public Body(int a) { 
  16.         this.a = a; 
  17.     } 
  18.     int a; 

輸出的結果是:

2
2
true

這個結果不難理解.

 

再看一個

  1. public class TestParam { 
  2.     public static void main(String[] args) { 
  3.         Body var1 = new Body(1); 
  4.         Body var2 = var1; 
  5.         doSomething( var2 ); 
  6.         System.out.println( var1.a ); 
  7.         System.out.println(var2.a); 
  8.         System.out.print(var1 == var2); 
  9.     } 
  10.  
  11.     public static void doSomething(Body body) { 
  12.         body = new Body(2); 
  13.     } 
  14. class Body { 
  15.     public Body(int a) { 
  16.         this.a = a; 
  17.     } 
  18.     int a; 

輸出的結果是
1
1
true

 

 

兩個程序就是在參數進入方法體之後的處理有所區別.

針對第二個程序,畫一個草圖.

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章