java操作符重載
String str1 = "hello";
String str2 = str1 + " world";
System.out.println(str2);
對于java的String對象+運算赞别,大學(xué)老師的解釋一直是操作符重載渡紫,也就默認了,突然有興趣自己摸索一下床三。
找到對應(yīng)的class文件,運行javap -c *.class
函數(shù)main的主要代碼如下:
public static void main(java.lang.String[]);
Code:
0: ldc #16 // String hello
2: astore_1
3: new #18 // class java/lang/StringBuilder
6: dup
7: aload_1
8: invokestatic #20 // Method java/lang/String.valueOf:(
Ljava/lang/Object;)Ljava/lang/String;
11: invokespecial #26 // Method java/lang/StringBuilder."<
init>":(Ljava/lang/String;)V
14: ldc #29 // String world
16: invokevirtual #31 // Method java/lang/StringBuilder.ap
pend:(Ljava/lang/String;)Ljava/lang/StringBuilder;
19: invokevirtual #35 // Method java/lang/StringBuilder.to
String:()Ljava/lang/String;
22: astore_2
23: getstatic #39 // Field java/lang/System.out:Ljava/
io/PrintStream;
26: aload_2
27: invokevirtual #45 // Method java/io/PrintStream.printl
n:(Ljava/lang/String;)V
30: return
可以看到編譯后的代碼實際創(chuàng)建了StringBuilder杨幼,而+操作符也被轉(zhuǎn)成了StringBuilder的append撇簿,所以一種說法是java實際并不是把操作符重載了(ps:因為其它操作符沒有類似的操作),而是操作符的語法糖而已差购。
參考文獻
javap
為什么Java不支持操作符重載