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。

作者:liutxer

来源:51CTO

时间: 2024-08-31 10:10:29

JAVA语法糖“+”运算符的相关文章

Java语法糖之foreach

  语法糖是一种几乎每种语言或多或少都提供过的一些方便程序员开发代码的语法,它只是编译器实现的一些小把戏罢了,编译期间以特定的字节码或者特定的方式对这些语法做一些处理,开发者就可以直接方便地使用了.这些语法糖虽然不会提供实质性的功能改进,但是它们或能提高性能.或能提升语法的严谨性.或能减少编码出错的机会.Java提供给了用户大量的语法糖,比如泛型.自动装箱.自动拆箱.foreach循环.变长参数.内部类.枚举类.断言(assert)等.   本篇主要是讲解foreach,foreach的语法经过

语法糖(Syntactic sugar)

语法糖(Syntactic sugar),是由Peter J. Landin(和图灵一样的天才人物,是他最先发现了Lambda演算,由此而创立了函数式编程)创造的一个词语,它意指那些没有给计算机语言添加新功能,而只是对人类来说更"甜蜜"的语法.语法糖往往给程序员提供了更实用的编码方式,有益于更好的编码风格,更易读.不过其并没有给语言添加什么新东西.   也称糖衣语法,指在计算机语言中添加的某种语法,这种语法对语言的功能没有影响,但是更方便程序员使用.通常来说,使用语法糖能够增加程序的可

Visual Basic 9不完全入门之语法糖

引言 在Visual Basic 9 Beta 1中,有着LINQ这样重量级的增强,也有着一些"微不足道的"语法糖.这些语法糖并不影响最终编译出的IL,但足以减轻程序员们的工作量,实现更高效,更轻松的开发. 语法糖有哪些? 1.局部变量类型推测 2.数组初始化器 3.对象初始化器 语法糖好吃吗? 个人认为,这些语法糖还是比较美味的.对象初始化器就很不错:局部变量类型推测也相当好用. 语法糖怎么吃? 1.局部变量类型推测 Visual Basic 9之前,只能用As语句定义一个强类型对象

java的移位运算符

移位运算符面向的运算对象也是二进制的"位".可单独用它们处理整数类型(主类型的一种).左移位运算符(<<)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)."有符号"右移位运算符(>>)则将运算符左边的运算对象向右移动运算符右侧指定的位数."有符号"右移位运算符使用了"符号扩展":若值为正,则在高位插入0:若值为负,则在高位插入1.Java也添加了一种"无符号"右移

java的关系运算符

关系运算符生成的是一个"布尔"(Boolean)结果.它们评价的是运算对象值之间的关系.若关系是真实的,关系表达式会生成true(真):若关系不真实,则生成false(假).关系运算符包括小于(<).大于(>).小于或等于(<=).大于或等于(>=).等于(==)以及不等于(!=).等于和不等于适用于所有内建的数据类型,但其他比较不适用于boolean类型. 1. 检查对象是否相等 关系运算符==和!=也适用于所有对象,但它们的含义通常会使初涉Java领域的人找

java的算术运算符

Java的基本算术运算符与其他大多数程序设计语言是相同的.其中包括加号(+).减号(-).除号(/).乘号(*)以及模数(%,从整数除法中获得余数).整数除法会直接砍掉小数,而不是进位. Java也用一种简写形式进行运算,并同时进行赋值操作.这是由等号前的一个运算符标记的,而且对于语言中的所有运算符都是固定的.例如,为了将4加到变量x,并将结果赋给x,可用:x+=4. 下面这个例子展示了算术运算符的各种用法:   //: MathOps.java // Demonstrates the math

Java编程那些事儿15——如何学好Java语法

第三章Java基础语法 学习一个程序语言,首先需要学习该语言的格式,这个格式就是语言的语法.语法,对于初学者来说,是学习程序最枯燥的地方,因为语法部分需要记忆的内容太多,而且需要理解很多的知识. 而对于曾经接触过其他程序设计语言的人来说,学习语法的速度特别快,主要是因为语法部分涉及的很多概念已经理解,而且大部分语言的语法格式比较类似. 本章就来详细介绍一下Java语言的基础语法,希望能够通过本章的学习掌握Java语言的语法格式. 3.1 如何学好Java语法 对于初学者来说,学习Java语法是一

Java语法基础之for语句练习

以下是对Java语法基础中的for语句进行了详细介绍,需要的朋友可以过来参考下   控制语句--for练习语句的嵌套应用 累加求和,计数器 循环嵌套一.语句的嵌套应用语句嵌套形式.其实就是语句中还有语句.形式多种多样,没有固定的格式和套路.1.打印偶数for(int x=1;x<=10;x++) {  if(x%2==1) continue;  System.out.prinln("x="+x); }二.累加求和,计数器1.获取1~10的和,并打印.思路://1,定义变量用于存储

谁能帮我把这个代码补全,就差一点点了。java语法编写本地监控系统

问题描述 谁能帮我把这个代码补全,就差一点点了.java语法编写本地监控系统 package com.tz.util; import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit; import java.awt.image.BufferedImage; import javax.swing.ImageIcon; import javax.swing.JF