日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JAVA語法糖“+”運(yùn)算符

JAVA提供的“+”運(yùn)算符,如Iteger+String,從C++的角度來看總是想找到JAVA是怎么重載這個“+”運(yùn)算符,于是進(jìn)去String這個類中看,然而并沒有什么卵發(fā)現(xiàn),于是乎想著JAVA是怎么做到的?下面來為你逐步分析下JAVA是怎么實(shí)現(xiàn)“+操作符重載的”。

成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供城中企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站建設(shè)、做網(wǎng)站、成都h5網(wǎng)站建設(shè)、小程序制作等業(yè)務(wù)。10年已為城中眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。

示例

 
 
  1. public class Example {  
  2. public static void main(String[] args) {  
  3. Integer a = null;  
  4. String b = a + "456";  
  5. System.out.println(b);  
  6. }  

這個程序很簡單就是一個Integer和String的“+”運(yùn)算表達(dá)式。運(yùn)行結(jié)果:null456

反編譯示例程序

命令:

 
 
  1. javap -c Example 

反編譯后的結(jié)果如下:

 
 
  1. Compiled from "Example.java" 
  2. public class com.boyu.budmw.test.Example extends java.lang.Object{ 
  3. public com.boyu.budmw.test.Example(); 
  4.   Code: 
  5.    0:    aload_0 
  6.    1:    invokespecial    #1; //Method java/lang/Object."":()V 
  7.    4:    return 
  8.  
  9. public static void main(java.lang.String[]); 
  10.   Code: 
  11.    0:    aconst_null 
  12.    1:    astore_1 
  13.    2:    new    #2; //class java/lang/StringBuilder 
  14.    5:    dup 
  15.    6:    invokespecial    #3; //Method java/lang/StringBuilder."":()V 
  16.    9:    aload_1 
  17.    10:    invokevirtual    #4; //Method java/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder; 
  18.    13:    ldc    #5; //String 456 
  19.    15:    invokevirtual    #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder; 
  20.    18:    invokevirtual    #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String; 
  21.    21:    astore_2 
  22.    22:    getstatic    #8; //Field java/lang/System.out:Ljava/io/PrintStream; 
  23.    25:    aload_2 
  24.    26:    invokevirtual    #9; //Method java/io/PrintStream.println:(Ljava/lang/String;)V 
  25.    29:    return 
  26.  

我們來分析下main函數(shù)部分:

  • 0:將常量null壓入操作數(shù)棧
  • 1:從操作數(shù)棧中將null彈出保存到索引為1的局部變量a中
  • 2:new一個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ù)

從上面的分析我們可以看到其最終是先生成了一個StringBuilder對象,之后的“+”操作符都是調(diào)用了StringBuilder.append()進(jìn)行“+”的。這就可以解釋上面示例程序運(yùn)行后為什么是null456了,append object的時候調(diào)用了

 
 
  1. public static String valueOf(Object obj) {  
  2. return (obj == null) ? "null" : obj.toString();  

將object轉(zhuǎn)化為String了。

為什么JAVA不支持操作符重載

像C++中類對操作符進(jìn)行了重載,個人覺得會操作維護(hù)難得問題,因?yàn)椴僮鞣剌d沒有一個標(biāo)準(zhǔn)來約束大家都可以想當(dāng)然的進(jìn)行重載會造成語義相差大,可讀性嚴(yán)重降低,所以java中去掉操作符重載這個特性和他的高級面向?qū)ο蠛芟喾?。so,不糾結(jié)這個問題。

后記

這都是在開發(fā)過程中會經(jīng)常使用的一些東西但是可能在平時開發(fā)過程中沒有挖的這么深入,都想當(dāng)然了,后面可以嘗試不斷挖掘這些不被發(fā)現(xiàn)的小case。


本文標(biāo)題:JAVA語法糖“+”運(yùn)算符
文章轉(zhuǎn)載:http://www.dlmjj.cn/article/ccddiej.html