標籤:筆試 程式員 初始化 對象 java程式員 反編譯 技術 網上 建立
原帖地址:http://www.cnblogs.com/dolphin0520/p/3778589.html
這個問題在很多書籍上都有說到比如《Java程式員面試寶典》,包括很多國內大公司筆試面試題都會遇到,大部分網上流傳的以及一些面試書籍上都說是2個對象,這種說法是片面的。
如果有不懂得地方可以參考這篇文章:
http://rednaxelafx.iteye.com/blog/774673/
首先必須弄清楚建立對象的含義,建立是什麼時候建立的?這段代碼在運行期間會建立2個對象嗎?毫無疑問不可能,用javap -c反編譯即可得到JVM執行的位元組碼內容:
很顯然,new只調用了一次,也就是說只建立了一個對象。
而這道題目讓人混淆的地方就是這裡,這段代碼在運行期間確實只建立了一個對象,即在堆上建立了"abc"對象。而為什麼大家都在說是2個對象呢,這裡面要澄清一個概念 該段代碼執行過程和類的載入過程是有區別的。在類載入的過程中,確實在運行時常量池中建立了一個"abc"對象,而在代碼執行過程中確實只建立了一個String對象。
因此,這個問題如果換成 String str = new String("abc")涉及到幾個String對象?合理的解釋是2個。
個人覺得在面試的時候如果遇到這個問題,可以向面試官詢問清楚”是這段代碼執行過程中建立了多少個對象還是涉及到多少個對象“再根據具體的來進行回答。
參考貼地址:http://rednaxelafx.iteye.com/blog/774673/
問題1:
String s = new String("xyz");
在運行時涉及幾個String執行個體?
答案:兩個,一個是字串字面量"xyz"所對應的、駐留(intern)在一個全域共用的字串常量池中的執行個體,另一個是通過new String(String)建立並初始化的、內容與"xyz"相同的執行個體。
問題2:
String s = new String("xyz");
涉及使用者聲明的幾個String類型的變數?
答案:一個,就是String s。
問題2:
String s = null;
涉及使用者聲明的幾個String類型的變數?
Java裡變數就是變數,參考型別的變數只是對某個對象執行個體或者null的引用,不是執行個體本身。聲明變數的個數跟建立執行個體的個數沒有必然關係,像是說:
String s1 = "a"; String s2 = s1.concat(""); String s3 = null; new String(s1);
這段代碼會涉及3個String類型的變數,
1、s1,指向下面String執行個體的1
2、s2,指向與s1相同
3、s3,值為null,不指向任何執行個體
以及3個String執行個體,
1、"a"字面量對應的駐留的字串常量的String執行個體
2、""字面量對應的駐留的字串常量的String執行個體
(String.concat()是個有趣的方法,當發現傳入的參數是Null 字元串時會返回this,所以這裡不會額外建立新的String執行個體)
3、通過new String(String)建立的新String執行個體;沒有任何變數指向它。
【轉】String str = new String("abc")建立了多少個對象?