Java方法參數傳遞(Java swap函數)

來源:互聯網
上載者:User

       Java裡方法的參數傳遞方式只有一種:值傳遞。值傳遞,就是將實際參數值的副本(複製品)傳入方法內,而參數本身不會受到任何影響。

      public class PrimitiveTransferTest

      {

            public static void swap(int a,int b)

             {

                     int temp=a;

                     a=b;

                     b=temp;

                     System.out.println("swap方法裡,a的值是"+a+";b的值是"+b);

              }

              public static void main(String args[])

              {

                      int a=6;

                      int b=9;

                      swap(a,b);

                      System.out.println("交換結束後,變數a的值是"+a+";變數b的值是"+b);

               }

          }

          運行結構:

          swap方法裡面,a的值是9;b的值是6;

          交換結束後,變數a的值是6;變數b的值是9;

         從運行結果可以看出,main方法裡面的變數a和b,並不是swap方法裡面的a和b。,也就是說swap方法的a和b只是main方法裡面變數a和b的複製品。

          Java程式從main方法開始執行,main方法開始定義了a、b兩個局部變數,當程式執行swap方法時,系統進入swap方法,並將main方法中的a、b變數作為參數值傳入swap方法,傳入swap方法的只是a/b的副本,而不是a、b本身,進入swap方法後系統產生了4個變數,main棧區的a和b,swap棧區的a和b。

        在main方法中調用swap方法時,main方法還未結束。因此,系統分別為main方法和swap方法分配兩塊棧區,用於儲存main方法和swap方法的局部變數。main方法中的a、b變數作為參數值傳入swap方法,實際上是在swap方法棧區中重新產生了兩個變數a、b,並將main方法棧區中a、b變數的值分別賦給swap方法棧區中a、b參數(就是對swap方法的a、b形參進行了初始化)。此時,系統存在兩個a變數,兩個b變數,只是存在於不同的方法棧區中而已。兩個輸出,一個是輸出swap方法中的a、b,一個是main方法中的a、b,程式只是改變的是swap方法中的a、b,而main方法中的a、b並沒有改變。這就是值傳遞的實質:當系統開始執行方法時,系統為形參執行初始化,就是把實參變數的值賦給方法的形參變數,方法裡操作的並不是實際的實參變數。

       前面是基本類型的參數傳遞,Java對於參考型別的參數傳遞,一樣採用的是值傳遞方式。

       class DataWrap

       {

            public int a;

            public int b;

       }

       public class ReferenceTransferTest

       {

            public static void swap(DataWrap dw)

            {

                     int tmp=dw.a;

                     dw.a=dw.b;

                     dw.b=tmp;

                     System.out.println("swap方法裡,a 屬性的值是"+dw.a+";b屬性的值是"+dw.b);

            }

            public static void main(String args[])

            {

                    DataWrap dw=new DataWrap();

                    dw.a=6;

                    dw.b=9;

                    swap(dw);

                    System.out.println("交換結束後,a屬性的值是"+dw.a+";b屬性的值是"+dw.b);

            }

  }

     運行結果:

     swap方法裡,a屬性的值是9;b屬性的值是6

     交換結束後,a屬性的值是9;b屬性的值是6

      從運行結果來看,swap方法和main方法的a、b兩個屬性值都被交換了,這很容易造成一種錯覺:調用swap方法時,傳入swap方法的就是dw對象本身,而不是它的複製品。但這隻是一種錯覺。

      程式從main方法開始執行,main方法開始建立了一個DataWrap對象,並定義了一個dw引用變數來指向DataWrap對象,這是一個與基本類型不同的地方。建立一個對象時,系統記憶體中有兩個東西:堆記憶體中儲存了對象本身,棧記憶體中儲存了引用該對象的引用變數。接下來,main方法中開始調用swap方法,main方法並未結束,系統會分別開闢出main和swap兩個棧區,用於存放main和swap方法的局部變數。調用swap方法時,dw變數作為實參傳入swap方法,同樣採用值傳遞方式:把main方法裡dw變數的值賦給swap方法裡dw形參,從而完成swap方法的單位形參的初始化。值得指出的是,main方法的dw是一個引用,它儲存了DataWrap對象的地址值,當把dw的值賦給swap方法的dw形參後,即讓swap方法的dw形參也儲存這個地址值,即也會引用到堆記憶體中的DataWrap對象。當程式在swap方法中操作dw形參時,由於dw只是一個引用變數,故實際操作的還是堆記憶體中的DataWrap對象。此時,不管是操作main方法裡的dw對象,還是操作swap方法裡的dw參數,起始都是操作它所引用的DataWrap對象,它們操作的是同一個對象。因此,當swap方法中交換dw參數所引用的DataWrap對象的a、b兩個屬性時,我們可以看到main方法中dw變數所引用的DataWrap對象的a、b兩個屬性值也被交換了。

       為了更好地證明main方法中的dw和swap方法中的dw是兩個變數,我們在swap方法的最後一行增加如下代碼:

      dw=null;//把dw直接賦值為null,讓它不再指向任何有效地址

      然後,main方法調用了swap方法後,再次訪問dw變數的a、b兩個屬性,依然可以輸出9、6。把swap方法中的dw賦值為null後,swap方法中失去了DataWrap的引用,不可在訪問堆記憶體中的DataWraper對象。但main方法中的dw變數不受任何影響,依然引用DataWrap對象,所以依然可以輸出DataWrap對象的a、b屬性值。

       

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.