摘要:提供的運(yùn)算符,如,從的角度來看總是想找到是怎么重載這個(gè)運(yùn)算符,于是進(jìn)去這個(gè)類中看,然而并沒有什么卵發(fā)現(xiàn),于是乎想著是怎么做到的下面來為你逐步分析下是怎么實(shí)現(xiàn)操作符重載的。
JAVA提供的“+”運(yùn)算符,如Iteger+String,從C++的角度來看總是想找到JAVA是怎么重載這個(gè)“+”運(yùn)算符,于是進(jìn)去String這個(gè)類中看,然而并沒有什么卵發(fā)現(xiàn),于是乎想著JAVA是怎么做到的?下面來為你逐步分析下JAVA是怎么實(shí)現(xiàn)“+操作符重載的”。
示例public class Example { public static void main(String[] args) { Integer a = null; String b = a + "456"; System.out.println(b); } }
這個(gè)程序很簡單就是一個(gè)Integer和String的“+”運(yùn)算表達(dá)式。運(yùn)行結(jié)果:
null456
命令:javap -c Example
反編譯后的結(jié)果如下:
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函數(shù)部分:
0:將常量null壓入操作數(shù)棧
1:從操作數(shù)棧中將null彈出保存到索引為1的局部變量a中
2:new一個(gè)StringBuilder
5:復(fù)制之前new出來的空間并將其壓入操作數(shù)棧
6:調(diào)用進(jìn)行初始化
9:將結(jié)果保存到操作數(shù)棧
10:調(diào)用StringBuilder.append(java/lang/Object)
13:將“456”壓入棧頂
15:StringBuilder.append(java/lang/String)
18:執(zhí)行toString函數(shù)
從上面的分析我們可以看到其最終是先生成了一個(gè)StringBuilder對(duì)象,之后的“+”操作符都是調(diào)用了StringBuilder.append()進(jìn)行“+”的。這就可以解釋上面示例程序運(yùn)行后為什么是null456了,append object的時(shí)候調(diào)用了
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
將object轉(zhuǎn)化為String了。
示例2private static void pS(String... strings) { for (String s : strings) { doSomething(); } } pS("123", "456");
上面的代碼反編譯后可以看到其實(shí)最終是將pS中的多個(gè)字符串作為一個(gè)數(shù)組傳給了strings,然后遍歷strings這個(gè)數(shù)據(jù)進(jìn)行操作。
為什么JAVA不支持操作符重載像C++中類對(duì)操作符進(jìn)行了重載,個(gè)人覺得會(huì)操作維護(hù)難得問題,因?yàn)椴僮鞣剌d沒有一個(gè)標(biāo)準(zhǔn)來約束大家都可以想當(dāng)然的進(jìn)行重載會(huì)造成語義相差大,可讀性嚴(yán)重降低,所以java中去掉操作符重載這個(gè)特性和他的高級(jí)面向?qū)ο蠛芟喾?。so,不糾結(jié)這個(gè)問題。
后記這都是在開發(fā)過程中會(huì)經(jīng)常使用的一些東西但是可能在平時(shí)開發(fā)過程中沒有挖的這么深入,都想當(dāng)然了,后面可以嘗試不斷挖掘這些不被發(fā)現(xiàn)的小case。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/66120.html
摘要:使用可以方便的對(duì)字符串進(jìn)行拼接。該方法使用進(jìn)行聲明,說明是一個(gè)線程安全的方法。所以,阿里巴巴開發(fā)手冊(cè)建議循環(huán)體內(nèi),字符串的連接方式,使用的方法進(jìn)行擴(kuò)展。但是,還要強(qiáng)調(diào)的是如果不是在循環(huán)體中進(jìn)行字符串拼接的話,直接使用就好了。 摘要: 學(xué)習(xí)阿里巴巴Java開發(fā)手冊(cè)。 原文:為什么阿里巴巴不建議在for循環(huán)中使用+進(jìn)行字符串拼接 微信公眾號(hào):Hollis Fundebug經(jīng)授權(quán)轉(zhuǎn)載,...
摘要:操作對(duì)應(yīng)字節(jié)碼中的個(gè)字節(jié)我們可以看到最關(guān)鍵的操作其實(shí)就是調(diào)用的其實(shí)是類的方法,此方法的入?yún)㈩愋褪牵祷刂殿愋褪?,翻譯過來就是類的方法,執(zhí)行完后將獲得的結(jié)果做了,檢查返回的對(duì)象類型是否是。 語法糖(Syntactic Sugar)的出現(xiàn)是為了降低我們編寫某些代碼時(shí)陷入的重復(fù)或繁瑣,這使得我們使用語法糖后可以寫出簡明而優(yōu)雅的代碼。在Java中不加工的語法糖代碼運(yùn)行時(shí)可不會(huì)被虛擬機(jī)接受,因此...
摘要:提供給了用戶大量的語法糖,比如泛型自動(dòng)裝箱拆箱循環(huán)變長參數(shù)內(nèi)部類枚舉類斷言新特性方法引用等解語法糖語法糖的存在主要是方便開發(fā)人員使用。 首先,部分總結(jié)文字引用 簡書作者:Eric新之助 。鏈接:https://www.jianshu.com/p/4de08deb6ba4 已獲得授權(quán) showImg(https://segmentfault.com/img/bVbfuX9?w=646&...
摘要:選擇排序算法實(shí)現(xiàn)實(shí)現(xiàn)選擇排序,記錄最小元素的索引,最后才交換位置說明交換兩個(gè)數(shù)組中的元素,在中有更簡單的寫法,這是的語法糖,其它語言中是沒有的。和語言中比較器的實(shí)現(xiàn)前面我們說到了,我們?yōu)榱送怀雠判蛩惴ǖ乃枷?,將所有的例子僅限在數(shù)組排序中。 showImg(https://segmentfault.com/img/remote/1460000017909538?w=1949&h=1080...
摘要:但其實(shí),虛擬機(jī)并不支持這些語法糖。方式為每個(gè)泛型類型創(chuàng)建唯一的字節(jié)碼表示,并且將該泛型類型的實(shí)例都映射到這個(gè)唯一的字節(jié)碼表示上。GitHub 2.5k Star 的Java工程師成神之路 ,不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的不來了解一下嗎); GitHub 2.5k Star 的Java工程師成神之路 ,真的確定不來了解一下嗎); 本文從 ...
閱讀 3116·2023-04-25 16:50
閱讀 921·2021-11-25 09:43
閱讀 3533·2021-09-26 10:11
閱讀 2529·2019-08-26 13:28
閱讀 2542·2019-08-26 13:23
閱讀 2433·2019-08-26 11:53
閱讀 3577·2019-08-23 18:19
閱讀 3000·2019-08-23 16:27