天天看點

方法傳遞參數&按值傳遞和按引用傳遞

方法傳遞參數:

   方法就像一個任務要做一件事情,而參數就是一個事情裡所需要給予的條件。就像要去買東西這樣一件事情,這件事情的參數是需要購買物品的錢,需要傳遞一個“錢”的參數給這個方法它才能進行執行。例如:

<a href="https://s5.51cto.com/wyfs02/M00/A7/82/wKioL1nnes-TnxIjAAl6SLt7rbE230.png" target="_blank"></a>

  釋義:method方法聲明了一個int類型的參數,參數名為a。在main方法裡調用method方法時就需要給它傳遞一個參數值,參數值要求符合類型且不超過類型的存儲範圍。此時給method傳遞的值是10,是以列印的結果就是10。

如果方法聲明了參數,在調用此方法時不傳遞參數值就會報文法錯誤。例如:

<a href="https://s5.51cto.com/wyfs02/M02/08/D3/wKiom1nnfYiz1cH6AAf0FDZScf4977.png" target="_blank"></a>

按值傳遞:

  在傳遞參數值中有按值傳遞和按引用傳遞。所有的基本資料類型都是按值傳遞,按值傳遞就是把值複制一份過去,不會對原本的變量産生影響,給方法傳遞的是值。是以即便在方法裡改變了傳遞的值,但它原本的值也不會有改變。因為給它傳遞的是值而不是原本的記憶體位址引用。例如:

<a href="https://s4.51cto.com/wyfs02/M01/A7/82/wKioL1nnetrTfPNVAA1BRsNesGY105.png" target="_blank"></a>

  在main方法裡将i的值傳遞給了參數a,傳遞的是一個值,是以參數a做出的改變并不會影響到變量i,i的輸出的結果還是10,a的輸出的結果則是100。

按引用傳遞:

  除了基本資料類型以外的值都是按引用傳遞,按引用傳遞其實就是按位址傳遞,給參數傳遞的是同一片記憶體位址,傳遞後參數和變量指向的都是同一個記憶體位址。是以參數做出改變,原本的變量值也會随之而改變。因為它傳遞的是記憶體位址,這是按引用傳遞和按位址傳遞最大的差別。例如:

<a href="https://s4.51cto.com/wyfs02/M00/08/D3/wKiom1nnfZmjLm_nAA9RdbpJVQo215.png" target="_blank"></a>

  數組是八種基本資料類型之外的類型,是以傳遞參數值時是按引用傳遞的,也就是按記憶體位址傳遞了一個引用。傳遞後此時數組i和參數a指向的都是使用的同一個記憶體位址,a的值發生了改變,i的值也會随之發生改變,是以列印的結果都111。就像兩個人在吃同一碗粥一樣,他們都是共同使用同一個資源,隻要其中一個人對這個資源進行了改變,那麼另一個也會受到影響。

  在java中是不可以對記憶體位址進行改變的,但是在C語言則可以通過記憶體指針對記憶體位址進行改變。是以按值傳遞在C語言裡可以将它們的值都指向同一個記憶體位址,就變成類似于按位址傳遞的效果了。例如:

<a href="https://s2.51cto.com/wyfs02/M02/A7/82/wKioL1nneuyRtwJ0AA8SYTZNInY076.png" target="_blank"></a>

通過記憶體指針改變記憶體位址後i的值和num的值都是指向同一個記憶體位址。是以i的值發生改變num的值也會随之改變。

本文轉自 ZeroOne01 51CTO部落格,原文連結:http://blog.51cto.com/zero01/1974010,如需轉載請自行聯系原作者