這是一道咱們公司的面試題,從招第二個Java以來就一直存在了。可是面試了這麼長的時間尚未一我的能夠所有答對,讓咱們一度覺得是這題出的不對。首先請看面試題。java
如下運算的輸出分別是多少:面試
public static void main(String[] args) { int i = 0; change(i); System.out.println(i); } private static void change(int i2) { i2 = 1; }
public static void main(String[] args) { Integer i = 0; change(i); System.out.println(i); } private static void change(Integer i2) { i2 = 1; }
public static void main(String[] args) { StringBuilder s = new StringBuilder("0"); change(s); System.out.println(s); } private static void change(StringBuilder s2) { s2 = new StringBuilder("1"); }
看完題以後你是否是已經有了本身的答案,記下你的答案,不介意的話評論區留言看看有沒有人能全對。函數
首先須要明確幾個概念。ui
實參與形參:code
以下圖所示,形式參數是在定義函數名和函數體的時候使用的參數,目的是接收調用該函數時傳入的參數。對象
實際參數是在調用有參函數時傳入的參數。blog
堆和棧:字符串
棧class
存放基本類型的變量數據和對象的引用,但對象自己不存放在棧中,而是存放在堆(new 出來的對象)或者常量池中(字符串常量對象存放在常量池中。)變量
堆
存放全部new出來的對象。
常量池
存放字符串常量和基本類型常量。
值傳遞和引用傳遞:
須要明確一點Java中只有值傳遞。
值傳遞和引用傳遞,不是傳遞的內容是值是值傳遞,傳遞的是引用就是引用傳遞;也不是傳遞的參數是普通類型就是值傳遞,是對象就是引用傳遞。
拿第三個題目進行分析。先看看在程序運行時堆棧中都發生了些什麼。
如上圖所示。
s
,而且在堆中開闢空間存放對象而且值爲0
;s2
,而且指向第一步中對象地址;s2
指向新的地址。從上圖中能夠看出,s
的指向並無發生變化,所以第三題得出的答案爲0。
繼續看第二題,第二題與第三題的區別在於,Integer
的值會放在常量池中,所以將上圖中的堆改成常量池其餘的徹底同樣,因此第二題的答案也是0。
對於第一題,因爲涉及到的形參和實參都是基本類型,所以i
和i2
徹底是在棧中操做,此時打印出的結果依舊是0。
轉評贊就是最大的鼓勵