又被引用傳遞引數坑了
阿新 • • 發佈:2018-12-21
雖然這個問題從我入門那一天起就知道了,可是很不幸的,剛剛刷題又陷進去了。
以Java為例做說明:
關於Java引數引用的說明
Java中只有值傳遞,不管是原始型別還是引用型別,傳遞的都是副本。
①如果引數型別是原始型別,那麼傳過來的就是這個引數的一個副本,也就是這個原始引數的值。
②如果引數是物件名,即正文中所說的“物件引用”——Java中物件的變數名實際上代表的是物件在堆中的地址(專業術語叫物件引用),那麼傳來的就是這個引用引數的副本,這個副本存放的是引數的地址。如果函式中沒有改變這個副本的地址,而是改變了地址中的值,那麼這個改變會影響傳入的引數。如果在函式中改變了副本的地址,那麼副本就指別地兒去了,原來傳入的引數不會受到影響。
另外需要注意,不可變型別如果是採用引用傳遞,那麼連裡面的值也改變不了,因為是不可變引數嘛。
其實概念是很簡單的概念,但是當刷題寫程式碼的時候,很容易就忘記了。
比如說,現在寫一個帶備忘錄的遞迴程式。那麼,有兩種做法,
- 第一種就是在遞迴方法外建立一個變數;
- 第二種就是用引用傳遞引數去維護這個變數;
第一種無論是修改引用本身,還是引用內容都沒有問題。
但是第二種如果設計了修改引用本身就會失敗,這個時候又專注於演算法的設計,很容易找不到問題所在,當然,如果你能夠除錯的話肯定能很快定位。