我對編譯3行程序的答案和結果感到困惑。下面是它的操作碼沿着代碼:http://pastebin.com/B1xxAjcp如果我不是完全錯誤的,它的明顯,如何理解是否創建了新的String對象
String s="abcd";
String s1=new String("efgh");
s.concat("ijkl");
這些線對應於這些操作碼:
1: istore_1
2: ldc #2 // String abcd
4: astore_2
5: new #3 // class java/lang/String
8: dup
9: ldc #4 // String efgh
11: invokespecial #5 // Method java/lang/String."<init>
":(Ljava/lang/String;)V
14: astore_3
15: aload_2
16: ldc #6 // String ijkl
18: invokevirtual #7 // Method java/lang/String.concat:
(Ljava/lang/String;)Ljava/lang/String;
所以我的理解ldC#index
意味着,而不是創建一個新對象,創建對常量文字池的引用,並將其推送到堆棧。
創建一個新對象,new
和dup
命令發生在ldC#index
之前。但在這個問題How many String object..?,第二個回答說,ldC#index
意味着String對象已經創建,其解釋是這樣的:
public static void main(java.lang.String[]);
Code:
0: ldc #2 // String ObjectOneObjectTwo
2: astore_1
3: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
6: aload_1
7: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
10: return
}
As you see, there is only one String object, which contains "ObjectOneObjectTwo".
- 我無法理解(也被人幫助我)我在哪裏得到了錯誤的概念?
- `ldc#index`是否意味着一個對象被創建並且與池中的引用關聯,但是並不意味着已經創建了一個「新」對象?從字面 「ABCD」
那麼有多少個對象我要在結束時,2或3或5? – shortCircuit
呃,上次我看了,3 + 2 = ** 5 ** :) –
好的。謝謝你的回答.. – shortCircuit