posts - 55,comments - 89,trackbacks - 0
          值傳遞:方法調用時,實際參數把它的值傳遞給對應的形式參數,方法執行中形式參數值的改變不影響實際參 數的值。
          引用傳遞:也稱為傳地址。方法調用時,實際參數的引用(地址,而不是參數的值)被傳遞給方法中相對應的形式參數,在方法執行中,對形式參數的操作實際上就是對實際參數的操作,方法執行中形式參數值的改變將會影響實際參數的值。
          下面舉例說明:
          傳值---傳遞基本數據類型參數
          public    class           PassValue{
              static void exchange(int a, int b){//靜態方法,交換a,b的值
                  int temp;
                  temp = a;
                  a = b;
                  b = temp;
              }
              public static void main(String[] args){
                 int i = 10;
                 int j = 100;
                 System.out.println("before call: " + "i=" + i + "\t" + "j = " + j);//調用前
                  exchange(i, j);                                                                    //值傳遞,main方法只能調用靜態方法
                  System.out.println("after call: " + "i=" + i + "\t" + "j = " + j);//調用后
              }
          }
          運行結果:
                  before call: i = 10        j = 100
                  after    call: i = 10        j = 100
          說明:調用exchange(i, j)時,實際參數i,j分別把值傳遞給相應的形式參數a,b,在執行方法exchange()時,形式參數a,b的值的改變不影響實際參數i和j的值,i和j的值在調用前后并沒改變。
          引用傳遞---對象作為參數
          如果在方法中把對象(或數組)作為參數,方法調用時,參數傳遞的是對象的引用(地址),即在方法調用時,實際參數把對對象的引用(地址)傳遞給形式參數。這是實際參數與形式參數指向同一個地址,即同一個對象(數組),方法執行時,對形式參數的改變實際上就是對實際參數的改變,這個結果在調用結束后被保留了下來。
          class Book{
              String name;
              private folat price;
              Book(String n,    float ){                //構造方法
                  name = n;
                  price = p;
              }
              static  void  change(Book a_book,    String n,    float p){    //靜態方法,對象作為參數
                      a_book.name = n;
                      a_book.price = p;
              }
              public void output(){        //實例方法,輸出對象信息
                  System.out.println("name: " + name + "\t" + "price: " + price);
              }
          }
           public class PassAddr{
              public static void main(String [] args){
                  Book b = new Book("java2",    32.5f);
                  System.out.print("before call:\t");        //調用前
                  b.output();
                  b.change(b,    "c++",    45.5f);            //引用傳遞,傳遞對象b的引用,修改對象b的值
                  System.out.print("after call:\t");            //調用后
                  b.output();
              }
          }
          運行結果:
                  before    call:    name:java2        price:32.5
                  after       call:    name:c++          price:45.5
          說明:調用change(b,"c++",45.5f)時,對象b作為實際參數,把引用傳遞給相應的形式參數a_book,實際上a_book也指向同一個對象,即該對象有兩個引用名:b和a_book。在執行方法change()時,對形式參數a_book操作就是對實際參數b的操作。

          posted on 2007-10-23 22:23 jiafang83 閱讀(90452) 評論(55)  編輯  收藏

          FeedBack:
          # re: java中的值傳遞和引用傳遞
          2007-10-24 10:43 | 翔南
          呵呵 鞏固了下java的基礎! 8錯  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2007-10-25 09:34 | Tom
          運行結果:
          before call: name:java2 price:32.5
          after call: name:c++ price:45.5
          那price是基本類型啊,怎么它的值也改變了呢?  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2007-10-25 11:45 | jiafang83
          @Tom
          price是對象a_book的一個屬性,這跟直接操作基本類型不一樣,中間還隔了一層,通過對象操作基本類型。
          我是新手,請多關照!  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2007-10-27 16:25 | 新青年
          不錯,我對Java的引用傳遞,一直都想了解,今天終于找到了!  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2008-05-25 21:06 | no
          簡單的錯誤。
          你的老師不合格!  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2008-07-22 19:15 | hansen
          但是 如果對象是 Integer 類型,也不能傳址 ,值還是不變的   回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2008-08-18 17:07 | june
          今天老師講了這個問題,我聽的不是很明白,謝謝你了!  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2008-08-20 19:50 | jarmine

          傳遞對象都是傳引用!!!

            回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2008-10-02 16:31 | javc
          還可以理解  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2008-11-14 00:33 | HelloWorld
          完全錯誤!
          首先:java中絕對沒有引用傳遞!

          如果是引用傳遞,最好的反例就是對String的修改

          在java中貌似引用傳遞,實際傳遞的是addressValue  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2008-12-25 17:23 | 啊啊
          好像不是一回事,下面的是成員函數  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2009-01-19 07:55 | JJ
          沒錯啊,傳遞的是Book對象啊,也就是說,在change里調用的a_book.name和a_book.price實際是b的屬性,對a_book的屬性修改,就是對b屬性的修改,這個不是引用傳遞是什么,由于JAVA中沒有指針的概念,所謂引用的傳遞就是將a_book和b指向同一地址,盡管好像是地址的傳遞,但是JAVA中沒有指針,所以不能說地址傳遞,而是引用傳遞。  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2009-06-18 23:17 | string
          @HelloWorld
          String是傳引用,只是由于String里面的數據不能改, 所以看起來像傳值(因為一旦改了就變成另外一個String了)。  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2009-06-18 23:18 | string
          一般基礎類型是傳遞的值, 其他的對象傳遞的是引用。

          String是傳引用,只是由于String里面的數據不能改,所以看起來像傳值(因為一旦改了就變成另外一個String了)。  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2009-07-17 16:12 | xiaots
          java 只有值傳遞,沒有引用....你們教材上是錯的!老師估計也教錯了!  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2009-11-10 14:31 | dyj
          @xiaots
          同意
            回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2010-05-02 17:18 | liizii
          @xiaots
          agree  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2010-06-14 09:26 | 草原蒼狼
          你還得考慮你傳遞的對象是你自己創建的還是 java 的類庫  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2010-06-21 11:03 | ne_akari
          又是一個排在搜索結果前面的害人帖子。
          值傳遞和引用傳遞的定義就是錯誤的,得出的結果也只能是謬誤了。
          望作者詳查。
            回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2010-12-01 11:18 | 小小
          挺好,呵呵,謝謝啦  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2011-03-25 14:57 | zhaoxiang
          樓主謬論啊啊啊啊啊啊啊啊  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2011-04-03 15:43 | ran
          java 中根本沒有引用傳遞。  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2011-04-27 22:25 | 肖波
          嗯,這位兄弟是正確的!@HelloWorld
            回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2011-08-31 22:02 | malson
          對的@string  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2011-09-02 17:23 | cc
          誤人子弟  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2011-09-27 08:41 | aimei
          @翔南
            回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2011-09-27 08:42 | aimei
          與值傳遞、址傳遞有關的內容  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2011-09-27 08:45 | aimei
          值傳遞與址遞是c語言中所要運用到得。但同時java語言也會運用到值傳遞  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2012-04-18 22:27 | tangliang
          @HelloWorld
          因為String類型比較特殊,是不可變字符串,所以,能你在調用修改方法時,調用那個方法的字符串把引用地址給了方法的形參,再修改的時候,實際上是通過形參修改的,由于修改原來字符串值時,產生了一個新的字符串,所以形參又指向了那個修字符串。而調用方法的那個字符串還是指向原來的那個字符串,所以,即使調用了修改方法,但是他指向的那個字符串還是沒改變。  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2012-04-18 22:36 | tangliang
          其實只是值類型和引用類型作為參數,都是把這個變量的值復制給了方法的形參。只不過,值類型變量里面保存的是值,而引用變量里保存的是一個對象的地址。由于值類型和引用變量的這種存儲方式的不同,才導致通過方法修改后得到的結果不同而已。并沒有什么值傳遞和引用傳遞。  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2012-05-29 23:20 | xx
          誤人子弟?。。。?!  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2012-08-01 14:08 | 阿布
          @xx
          請你舉例子說明下,謝謝!  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2012-08-22 15:52 | zz
          @xiaots
          sun 公司也錯了  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2012-09-26 15:33 | 反對法
          @HelloWorld
          說的好,java中只有值傳遞,,包括對象  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2013-03-19 21:29 | Anna@java
          博主:
          public class PassAddr{
          public static void main(String [] args){
          Book b = new Book("java2", 32.5f);
          System.out.print("before call:\t"); //調用前
          b.output();
          b.change(b, "c++", 45.5f); //引用傳遞,傳遞對象b的引用,修改對象b的值
          System.out.print("after call:\t"); //調用后
          b.output();
          }
          }
          這一塊代碼并不能說明你上述的引用傳遞和值傳遞的區別,并不是引用傳遞傳的是對象這一說!你這里使用了Book類的實例b調用了Book類里面的change方法,就相當于你使用了setter方法給屬性賦值一樣,當前類操作當前屬性,改變當前類的屬性值這是很正常的,證明不了你的(傳對象和基礎類型論)
          public class A{
          private int number=0;
          public void change(int newValue){
          this.number = newValue;
          }
          public void printNumber(){
          System.out.print(this.number);
          }
          }
          public class Test{
          public static void main(String args[]){
          A a = new A();
          a.printNumber();//傳遞前
          a.change(100);//值傳遞??引用傳遞??
          a.printNumber();//傳遞后
          }
          }
          看看這里,這里是值傳遞還是引用傳遞?改變了對象的引用,叫引用傳遞嗎?傳遞了基礎類型int值,叫值傳遞嗎?  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2013-05-14 11:15 | 小蔡
          很明顯上面的例子有問題  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2013-08-14 09:30 | 啦啦啦
          @HelloWorld
          String不是final類型么?怎么修改?  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2013-08-21 20:30 | 游客
          @HelloWorld
          對說得好!哈哈...java中根本就沒有傳遞引用這一說!
          希望樓主不要讓更多的人出錯啦  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2013-08-31 22:04 | aa
          能不能搞個正確的呀  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2013-09-04 10:28 | 1
          好  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2013-09-08 19:00 | Herry
          Java只有值傳遞!  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2013-09-29 22:22 | Leonidas
          看到了這個,我不得不說下。。
          JAVA沒有引用傳遞。。
          JAVA的所有傳遞。。都是值傳遞?。。。。?!

          傳遞對象,傳遞的是這個對象在內存中的地址,這個地址是字符,這個字符是值?。?!

          這就是和C中的指針傳遞的引用的根本區別。。。。。  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2013-10-06 16:33 | Yannis
          @HelloWorld

          正解!?。。?!  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2013-12-09 13:45 | xx
          浮點型,在實際參數里面把值改了@Tom
            回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2014-01-22 15:42 | likun
          跨越了6年的討論,在第七年的今天,我想樓主應該已經知道正確答案是什么了,樓主快回歸本帖公布答案~~~個人一直的觀點就是,java只有值傳遞,至于怎么傳的、如何證明就不得而知了。。。  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2014-05-20 14:29 | thooo
          java只有值傳遞。既然只是傳值,那么在JAVA的方法調用中,形參永遠不可以改變實參的地址,但是卻可以改變實參的值(也可以說是內容)。  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2014-08-12 11:57 | 123
          樓主絕對是謬論  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2014-09-04 11:03 | somewhereyu
          你們不看java核心技術嗎?第九版 121頁。

          先不管引用的概念是什么,至少官方是這么講的。

          call by reference 表示方法接收的是調用者提供的變量地址。。。  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2014-09-04 11:06 | somewhereyu
          錯了,還真是值傳遞。汗啊。。。  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2014-09-04 11:07 | somewhereyu
          @somewhereyu 汗自己一下。
            回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2015-03-13 14:04 | 呵呵
          @somewhereyu
          第八年了,結論出來了嗎  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2015-04-10 18:23 | 蝸牛
          求后續真相  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞[未登錄]
          2015-08-15 15:20 | ws
          .........。。這個錯誤結論排在搜索結果第一位啊,誤導了多少不愛看評論的童鞋啊  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2015-12-03 22:37 | 于峰
          我其實不明白時具體說的是什么,但是我能感覺到,這樣的輸出是對的,我覺得還是需要經常的練習,練出感覺來,多我就習慣了;  回復  更多評論
            
          # re: java中的值傳遞和引用傳遞
          2016-01-18 01:04 | 朱凱
          @string
          同意  回復  更多評論
            

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


          網站導航:
           
          主站蜘蛛池模板: 安顺市| 务川| 沁源县| 大连市| 景洪市| 新绛县| 如皋市| 怀宁县| 灌云县| 成武县| 白城市| 无极县| 大方县| 阳信县| 乐东| 武鸣县| 启东市| 略阳县| 定南县| 绥中县| 贡觉县| 柳河县| 榆林市| 锡林浩特市| 乐山市| 保亭| 郴州市| 绥江县| 新绛县| 内黄县| 平昌县| 黑水县| 安西县| 娱乐| 昌吉市| 师宗县| 贵南县| 德钦县| 象州县| 安化县| 霍邱县|