摘要:提供的運算符,如,從的角度來看總是想找到是怎么重載這個運算符,于是進去這個類中看,然而并沒有什么卵發現,于是乎想著是怎么做到的下面來為你逐步分析下是怎么實現操作符重載的。
JAVA提供的“+”運算符,如Iteger+String,從C++的角度來看總是想找到JAVA是怎么重載這個“+”運算符,于是進去String這個類中看,然而并沒有什么卵發現,于是乎想著JAVA是怎么做到的?下面來為你逐步分析下JAVA是怎么實現“+操作符重載的”。
示例public class Example { public static void main(String[] args) { Integer a = null; String b = a + "456"; System.out.println(b); } }
這個程序很簡單就是一個Integer和String的“+”運算表達式。運行結果:
null456
命令:javap -c Example
反編譯后的結果如下:
Compiled from "Example.java" public class com.boyu.budmw.test.Example extends java.lang.Object{ public com.boyu.budmw.test.Example(); Code: 0: aload_0 1: invokespecial #1; //Method java/lang/Object."":()V 4: return public static void main(java.lang.String[]); Code: 0: aconst_null 1: astore_1 2: new #2; //class java/lang/StringBuilder 5: dup 6: invokespecial #3; //Method java/lang/StringBuilder." ":()V 9: aload_1 10: invokevirtual #4; //Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; 13: ldc #5; //String 456 15: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 18: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 21: astore_2 22: getstatic #8; //Field java/lang/System.out:Ljava/io/PrintStream; 25: aload_2 26: invokevirtual #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 29: return }
我們來分析下main函數部分:
0:將常量null壓入操作數棧
1:從操作數棧中將null彈出保存到索引為1的局部變量a中
2:new一個StringBuilder
5:復制之前new出來的空間并將其壓入操作數棧
6:調用進行初始化
9:將結果保存到操作數棧
10:調用StringBuilder.append(java/lang/Object)
13:將“456”壓入棧頂
15:StringBuilder.append(java/lang/String)
18:執行toString函數
從上面的分析我們可以看到其最終是先生成了一個StringBuilder對象,之后的“+”操作符都是調用了StringBuilder.append()進行“+”的。這就可以解釋上面示例程序運行后為什么是null456了,append object的時候調用了
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
將object轉化為String了。
示例2private static void pS(String... strings) { for (String s : strings) { doSomething(); } } pS("123", "456");
上面的代碼反編譯后可以看到其實最終是將pS中的多個字符串作為一個數組傳給了strings,然后遍歷strings這個數據進行操作。
為什么JAVA不支持操作符重載像C++中類對操作符進行了重載,個人覺得會操作維護難得問題,因為操作符重載沒有一個標準來約束大家都可以想當然的進行重載會造成語義相差大,可讀性嚴重降低,所以java中去掉操作符重載這個特性和他的高級面向對象很相符。so,不糾結這個問題。
后記這都是在開發過程中會經常使用的一些東西但是可能在平時開發過程中沒有挖的這么深入,都想當然了,后面可以嘗試不斷挖掘這些不被發現的小case。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66120.html
摘要:使用可以方便的對字符串進行拼接。該方法使用進行聲明,說明是一個線程安全的方法。所以,阿里巴巴開發手冊建議循環體內,字符串的連接方式,使用的方法進行擴展。但是,還要強調的是如果不是在循環體中進行字符串拼接的話,直接使用就好了。 摘要: 學習阿里巴巴Java開發手冊。 原文:為什么阿里巴巴不建議在for循環中使用+進行字符串拼接 微信公眾號:Hollis Fundebug經授權轉載,...
摘要:操作對應字節碼中的個字節我們可以看到最關鍵的操作其實就是調用的其實是類的方法,此方法的入參類型是,返回值類型是,翻譯過來就是類的方法,執行完后將獲得的結果做了,檢查返回的對象類型是否是。 語法糖(Syntactic Sugar)的出現是為了降低我們編寫某些代碼時陷入的重復或繁瑣,這使得我們使用語法糖后可以寫出簡明而優雅的代碼。在Java中不加工的語法糖代碼運行時可不會被虛擬機接受,因此...
摘要:提供給了用戶大量的語法糖,比如泛型自動裝箱拆箱循環變長參數內部類枚舉類斷言新特性方法引用等解語法糖語法糖的存在主要是方便開發人員使用。 首先,部分總結文字引用 簡書作者:Eric新之助 。鏈接:https://www.jianshu.com/p/4de08deb6ba4 已獲得授權 showImg(https://segmentfault.com/img/bVbfuX9?w=646&...
摘要:選擇排序算法實現實現選擇排序,記錄最小元素的索引,最后才交換位置說明交換兩個數組中的元素,在中有更簡單的寫法,這是的語法糖,其它語言中是沒有的。和語言中比較器的實現前面我們說到了,我們為了突出排序算法的思想,將所有的例子僅限在數組排序中。 showImg(https://segmentfault.com/img/remote/1460000017909538?w=1949&h=1080...
摘要:但其實,虛擬機并不支持這些語法糖。方式為每個泛型類型創建唯一的字節碼表示,并且將該泛型類型的實例都映射到這個唯一的字節碼表示上。GitHub 2.5k Star 的Java工程師成神之路 ,不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的確定不來了解一下嗎); 本文從 ...
閱讀 3097·2023-04-25 16:50
閱讀 911·2021-11-25 09:43
閱讀 3523·2021-09-26 10:11
閱讀 2524·2019-08-26 13:28
閱讀 2535·2019-08-26 13:23
閱讀 2428·2019-08-26 11:53
閱讀 3571·2019-08-23 18:19
閱讀 2993·2019-08-23 16:27