成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JAVA語法糖“+”運算符

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

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

示例

  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的“+”運算表達式。運行結果:null456

反編譯示例程序

命令:

  1. javap -c Example 

反編譯后的結果如下:

  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."<init>":()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."<init>":()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函數部分:

  • 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的時候調用了

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

將object轉化為String了。

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

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

后記

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

責任編輯:武曉燕 來源: segmentfault
相關推薦

2025-02-24 11:16:20

2009-08-11 15:51:08

C#運算符算術運算符

2009-08-12 15:20:18

C#賦值運算符復合賦值運算符

2010-07-20 14:52:51

Perl語法

2009-08-12 15:02:49

C#賦值運算符簡單賦值運算符

2009-07-09 17:40:26

Java運算符

2023-04-10 08:58:13

C#關系運算符

2024-02-26 15:17:20

2009-06-21 13:48:05

ShellLinux運算符

2021-12-15 10:25:57

C++運算符重載

2009-11-18 09:19:47

PHP邏輯運算符

2009-08-12 09:30:10

C#??運算符

2023-04-11 10:13:04

Java運算符反碼

2009-08-12 10:47:03

C#運算符重載

2009-11-26 11:12:07

PHP運算符

2017-05-11 16:38:07

javascript邏輯運算符

2009-12-08 10:00:36

PHP比較運算符

2009-08-12 14:49:33

C#移位運算符

2013-08-15 16:48:39

.Net基礎

2021-02-20 23:34:22

JavaScript運算符開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品久久久久久久久久久久久 | 欧美黑人狂野猛交老妇 | 亚洲一区二区三区视频 | 精品产国自在拍 | 亚洲国产精品一区在线观看 | 欧美日韩中文字幕在线播放 | 很黄很污的网站 | 91在线中文字幕 | 欧美日韩美女 | 亚洲超碰在线观看 | 国产亚洲精品久久久久久牛牛 | 色婷婷av99xx | 激情久久网| 亚洲精品自拍 | 视频一区二区三区在线观看 | 国产乱码精品一区二区三区中文 | 伊人狠狠操 | 国产一级免费在线观看 | 99国产精品一区二区三区 | 日韩精品免费 | 7777久久| 精品欧美乱码久久久久久 | 日韩激情视频一区 | 亚洲视频三区 | 国产一区二区影院 | 嫩草视频在线免费观看 | xx性欧美肥妇精品久久久久久 | 亚洲三级在线观看 | 在线看免费| 一二三四在线视频观看社区 | 欧美在线视频一区二区 | 日本成人久久 | 亚洲一区二区在线 | 隔壁老王国产在线精品 | 日韩精品一区二区三区中文字幕 | 亚洲精品乱码久久久久久按摩 | 国产一区二区在线免费播放 | www精品美女久久久tv | 成人免费一区二区 | 四虎影院在线免费观看 | 国产精品久久久久久吹潮 |