国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 類庫下載 java類庫 JAVA語法糖“+”運算符

JAVA語法糖“+”運算符

Oct 15, 2016 am 09:50 AM

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

示例

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

這個程序很簡單就是一個Integer和String的“+”運算表達式。運行結(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."<init>":()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."<init>":()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一個StringBuilder

5:復制之前new出來的空間并將其壓入操作數(shù)棧

6:調(diào)用進行初始化

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()進行“+”的。這就可以解釋上面示例程序運行后為什么是null456了,append object的時候調(diào)用了

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

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

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

像C++中類對操作符進行了重載,個人覺得會操作維護難得問題,因為操作符重載沒有一個標準來約束大家都可以想當然的進行重載會造成語義相差大,可讀性嚴重降低,所以java中去掉操作符重載這個特性和他的高級面向?qū)ο蠛芟喾?。so,不糾結(jié)這個問題。

后記

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


本站聲明
本文內(nèi)容由網(wǎng)友自發(fā)貢獻,版權(quán)歸原作者所有,本站不承擔相應法律責任。如您發(fā)現(xiàn)有涉嫌抄襲侵權(quán)的內(nèi)容,請聯(lián)系admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣服圖片

Undresser.AI Undress

Undresser.AI Undress

人工智能驅(qū)動的應用程序,用于創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用于從照片中去除衣服的在線人工智能工具。

Clothoff.io

Clothoff.io

AI脫衣機

Video Face Swap

Video Face Swap

使用我們完全免費的人工智能換臉工具輕松在任何視頻中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的代碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

功能強大的PHP集成開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級代碼編輯軟件(SublimeText3)

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276