java中的按值傳遞圖例講解

java中的按值傳遞圖例講解
這幾天論壇上有人在討論java中按值傳遞的問題,說來說去,都不是十分完整和準確。
我想通過圖片和例子更加有助於理解這個概念。
 
先看下面的例子:
public class TestSample{
       public static void link(int i){
              i=2;
       }
       public static void main(String[] args){
               int i = 1;
               link(i);
               System.out.println(i);
       }
}
 
在主函數中定義基本整型變量i,並賦予值1。把i做爲參數傳給方法link,在link中改變i的值爲2。
但是在主函數中輸出i時,i的值仍然爲1。爲什麼會這樣,這就是java的按值傳遞,彆着急接着往下看。
 
在理解按值傳遞的概念時,是要區分幾種情況的,論壇裏的各位弟兄在講的時候沒有區分這些情況,造成十分混亂。
 
根據傳遞的參數,分成基本變量傳參和引用變量傳參。
 
先來看基本變量傳參,也就是上面的例子。看下圖:實箭頭代表賦的初值,虛箭頭代表改變後的值。
 
 
大家可以看到,main()和link()中的i是兩個不同的變量,他們的相同點就是把值也就是1傳了過來。
如果把link()中的i的值變成2,main()中的i的值是不會跟着變的。
再有就是link()中的i是局部變量,他的生命週期僅是在方法link中,運行完link後,這個變量i就失效,會被回收器回收。
 
再來看引用變量傳參,這裏面還要分成兩種情況,一種是給形參賦予一個新的變量,看下面的例子,
public class TestSample{
       public static void link(Car i){
              i=new Track();
       }
       public static void main(String[] args){
               Car i = new Car();
               link(i);
               System.out.println(i);
       }
}
 
main()方法定義一個car型變量i,傳到link()方法中,然後改變了i的值,返回main()後,輸出i的值,他仍然是一個car,不會改變。
看下面的圖:
 
 
方法link()中的變量i,一開始是引向car類型的一個實例的,後來使用i=new Track()語句,把i引向了另一個track型的對象實例。這個操作絲毫不會影響到main()方法中的i。
注意:並不只是使用new這個關鍵字才能使變量改變引用。
string是一個特例,比如,string s="hello";
s=s+" world";
新的s已經改變了他的引用對象,就象s=new String(s+" world");一樣。
 
再看另一種情況,形參並不會改變引用對象,而是改變原來引用對象的值。看例子:
public class TestSample{
       public static void link(Car i){
              i.addABS();
       }
       public static void main(String[] args){
               Car i = new Car();
               link(i);
               System.out.println(i);
       }
}
main()方法定義一個car型變量i,傳到link()方法中,然後對i進行addABS()方法的操作。返回到main(),再輸出i,發現i已經變成了一個加裝了ABS的car了。以上幾種情況中,只有這種情況才能對實參進行修改。看下面的圖:
 
 
無論是main()還是link()中的i,一直都是指向同一個實例,在link()中對此實例的任何修改,都會影響到實參i的值。
 
希望大家在傳參的時候要分清情況,區別對待。
 
發佈了75 篇原創文章 · 獲贊 3 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章