這兩天,在網上逛的時候,發現了以下的一道面試題,感受還有蠻有意思的,要是不仔細看還真容易掉到坑裏面。第一眼看起來比較繞,因此比較難理解。最終我跳出了這個坑,也想把這個跳坑的經歷分享出來。題目以下 , 請問輸出的是什麼?爲何?html
/**
* @author hafiz.zhang
* @description: 一個奇怪的現象
* @date Created in 2018/7/2 22:44.
*/
public class Test {
public static void main(String[] args) {
String ermao = "a";
String bb = addStr(ermao);
System.out.println(ermao);
}
private static String addStr(String ermao) {
ermao = ermao + "b";
return ermao;
}
}
毫無疑問,這道題的答案是:a , 你答對了麼?在講解緣由以前,讓咱們想了解一點基礎知識吧:java
其實,Java官方並無給出值傳遞仍是引用傳遞的概念。官方將Java參數傳遞類型分爲傳遞基本類型參數和傳遞引用類型參數。當參數爲基本類型(Java八大基本類型:int、short、float、double、long、boolean、byte、char)的時候,就是傳遞基本類型參數了,當參數爲封裝類型(非基本類型,如Integer、Long、Boolean等)的時候,就是傳遞引用傳遞參數了。官方文檔地址:Java參數傳遞。面試
從Java的底層機制來講,基本類型的變量存放在棧裏;封裝類型中,對象放在堆裏,對象的引用放在棧裏。Java在方法傳遞參數時,是將變量複製一份,而後傳入方法體去執行。數組
由於String類型在傳遞過程當中的步驟以下:oracle
還不清晰?不要緊,那咱們直接上個圖會不會來得更直觀:app
經過本文咱們就理解了Java在方法傳參的整個過程。其實仍是上面那句比較重要的話Java在方法傳遞參數時,是將變量複製一份,而後傳入方法體去執行。給棒棒噠本身一波掌聲👏👏👏,點滴積累,方成大事~學習