qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

          Java中參數(shù)傳遞類型只有值傳遞

          Java核心技術(shù)卷I里有一個(gè)結(jié)論我覺得挺有意思的:java中沒有引用傳遞,只有值傳遞

            首先看定義:

            值傳遞,是指方法接收的是調(diào)用者提供的值

            引用傳遞,是指方法接收的是調(diào)用者提供的變量地址

            以前學(xué)習(xí)C++時(shí)把參數(shù)傳遞分為值傳遞和引用傳遞,國內(nèi)的不少java教材愿意把對象的傳遞理解是引用傳遞,為什么它們會(huì)這么說呢?可以看下面一個(gè)例子:

          1. import java.util.Calendar;  
          2. public class ChangeValue {  
          3.     public static void main(String[] args) {  
          4.         Calendar oc = Calendar.getInstance();  
          5.         System.out.println("origin:"+oc.getTime());  
          6.         changeDate(oc);  
          7.         System.out.println("after:"+oc.getTime());        
          8.     }  
          9.       
          10.     static void changeDate(Calendar pd){  
          11.         pd.set(197011);  
          12.     }  
          13. }

            某時(shí)刻程序輸出:

          origin:Thu Jan 05 21:15:59 CST 2012
          after:Sun Feb 01 21:15:59 CST 1970

            oc對象的值改變了,很多人就認(rèn)為java對象傳遞實(shí)際上是引用傳遞。

            過程應(yīng)該是這樣的:

            運(yùn)行changeDate這個(gè)函數(shù)時(shí),方法得到的是對象引用的拷貝,oc和pd同時(shí)引用同一個(gè)對象,所以函數(shù)運(yùn)行結(jié)束后,pd已經(jīng)消失了,但是對引用對象的更改卻也影響了oc所引用的同一對象,結(jié)合對之前的定義理解,這應(yīng)該是值傳遞的過程(傳遞的是對象引用的拷貝)。

            以下附上另一個(gè)例子,兩個(gè)對象的交換函數(shù)(C++中可以輕易實(shí)現(xiàn)):

          1. public class Swap {  
          2.     public static void main(String[] args) {  
          3.         ObjectSample o1 = new ObjectSample("hello");  
          4.         ObjectSample o2 = new ObjectSample("你好");  
          5.         System.out.println("before swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());  
          6.         Swap.swapObject(o1, o2);  
          7.         System.out.println("after swap o1:"+o1.getTitle()+" o2:"+o2.getTitle());  
          8.     }  
          9.     static void swapObject(ObjectSample o1, ObjectSample o2){  
          10.         ObjectSample temp = new ObjectSample("temp");  
          11.         temp = o1;  
          12.         o1 = o2;  
          13.         o2 = temp;  
          14.     }  
          15. }  
          16. class ObjectSample{  
          17.     private String title;  
          18.       
          19.     ObjectSample(String title){  
          20.         this.title = title;  
          21.     }  
          22.       
          23.     public String getTitle(){  
          24.         return title;  
          25.     }  
          26. }

            輸出結(jié)果:

          before swap o1:hello o2:你好
          after swap o1:hello o2:你好

            Java在交換程序中并沒有交換兩個(gè)對象的值,交換的是兩個(gè)對象的拷貝,不能實(shí)現(xiàn)讓對象參數(shù)引用一個(gè)新對象,究其原因還是因?yàn)镴ava是采用了值傳遞而非引用傳遞。

            還有不少和以前自己接觸的觀點(diǎn)不一樣的地方,當(dāng)然需要借鑒的吸收并且經(jīng)過自己的實(shí)踐來辨別。

          posted on 2012-02-24 15:27 順其自然EVO 閱讀(149) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2012年2月>
          2930311234
          567891011
          12131415161718
          19202122232425
          26272829123
          45678910

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 桐庐县| 伊宁市| 资中县| 尉氏县| 大渡口区| 开化县| 务川| 美姑县| 慈溪市| 剑川县| 车险| 湘乡市| 大姚县| 北宁市| 蕲春县| 望城县| 沐川县| 拉萨市| 大邑县| 冷水江市| 得荣县| 鄢陵县| 沅江市| 阳谷县| 三门县| 佛学| 子洲县| 陇川县| 海安县| 祁连县| 嘉禾县| 塘沽区| 渝北区| 屏东市| 梁平县| 榆林市| 包头市| 江山市| 凌云县| 得荣县| 伊通|