標籤:函數 lang 記憶體 程式設計語言 指標 就是 操作 方法 question
一、Java的值傳遞
(知乎使用者
連結:https://www.zhihu.com/question/20628016/answer/15683373
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處)
Java 中的所有函數調用都是值傳遞。
值傳遞是指,函數在調用時,傳遞的參數不是實參本身,而是它的副本。
引用傳遞是指,函數在調用時,傳遞的參數就是實參本身(的地址)。
顯然,在使用引用傳遞的情況下,在函數體內可以對參數本身進行修改,修改結果會對函數調用者產生影響。而使用值傳遞,由於函數內對參數的修改實際上不是對參數本身,而是對參數的副本進行的修改,因此,修改結果不會對調用者產生影響。
在 Java 中,對象(類的執行個體)都是通過引用來訪問的。例如:
Object foo = new Object();
其中,foo 是一個引用,指向了新建立的這個 Object 對象。
的確,你可以在某個方法(函數)中,對其參數引用的對象進行修改,例如:
void doSth(Object bar) { bar.attr = newValue; }
假設某個調用者調用了 doSth 方法,並且將 foo 傳入。在方法返回之後,foo 所引用的對象的 attr 屬性變成了 newValue。但這並不是值傳遞。因為 doSth 方法體內修改的是 foo 所引用的對象,而不是 foo 本身。
在 Java 中,你絕不可能在方法體內,把作為參數傳入的引用本身指向其他對象。因為 Java 所有的函數調用都是值傳遞。這樣的修改只會修改參數的副本,而不是參數本身。
--------------
Java 的設計目的之一就是為了填 C/C++ 的各種「坑」,讓程式設計語言更加易用和易於理解,例如垃圾自動回收機制,單繼承策略,等等。引用傳遞使得方法內部可以對方法外的資料進行修改,這無疑增加了一定的(但我覺得這很少)危險性。當然,這會使語言的靈活性降低,就算你對你的資料掌控得很好,你也不能隨心所欲地修改它。事實上,你完全可以通過傳遞引用參數來修改方法外建立的對象。因此,受到制約的實際上就只有那些原生類型而已。
或許這是 Java 注重安全性與實用性而寧願放棄一些靈活性的設計哲學的一種體現。
1.這個解釋的不錯,其實不用長篇大論,本質上講java沒有所謂的引用(地址)傳遞是因為java規定了引用本身不能操作修改記憶體位址;
2.值傳遞與引用傳遞的最大區別就是記憶體屬於copy還是share,前者屬於copy,基本類型直接copy內容,object的變數copy的是記憶體位址(也就是引用),copy過來的引用是被封裝過的,因此在java裡沒辦法操作引用去修改變數的記憶體位址,也就是你代碼解釋的情況;
3.假如說java中有"引用傳遞",那麼違背了java資深的規定,引用是"唯讀"的(而C++的指標是可讀寫的);
4.而C++由於採用的是指標,指標是"可寫"的,因此才分別給了“”copy(值傳遞)“”和"share(地址傳遞)"來作明確區分.
二、Java的ThreadLocal源碼分析
三、Java ThreadLocalMap的引申 (強引用,弱引用,軟引用,虛引用)
四、Redis服務及應用情境
五、Java Spring Redis(spring配置,RedisTemplate類詳解,@CachePut\@Cacheable\@CacheEvict)
Java筆記1