当前位置: 首页 > 科技观察

JAVA语法糖“+”运算符

时间:2023-03-12 00:20:34 科技观察

JAVA提供的“+”运算符,比如Iterger+String,站在C++的角度,一直想搞清楚JAVA是如何重载这个“+”运算符的,于是进入String寻找atthisclass,但是没有找到egg,于是我就想JAVA是怎么做到的?下面一步步分析JAVA是如何实现“+运算符重载”的。示例publicclassExample{publicstaticvoidmain(String[]args){Integera=null;Stringb=a+"456";System.out.println(b);}}这个程序只是Integer和String的“+”运算表达式。运行结果:null456反编译示例程序命令:javap-cExample反编译结果如下:Compiledfrom"Example.java"publicclasscom.boyu.budmw.test.Exampleextendsjava.lang.Object{publiccom.boyu.budmw.test.Example();Code:0:aload_01:invokespecial#1;//Methodjava/lang/Object."":()V4:returnpublicstaticvoidmain(java.lang.String[]);Code:0:aconst_null1:astore_12:new#2;//classjava/lang/StringBuilder5:dup6:invokespecial#3;//Methodjava/lang/StringBuilder."":()V9:aload_110:invokevirtual#4;//Methodjava/lang/StringBuilder.append:(Ljava/lang/Object;)Ljava/lang/StringBuilder;13:ldc#5;//String45615:invokevirtual#6;//Methodjava/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;18:invokevirtual#7;//Methodjava/lang/StringBuilder.toString:()Ljava/lang/String;21:astore_222:getstatic#8;//字段java/lang/System.out:Ljava/io/PrintStream;25:aload_226:invokevirtual#9;//Methodjava/io/PrintStream.println:(Ljava/lang/String;)V29:return}我们来分析一下e主要功能数字部分:0:将常量null压入操作数栈1:将null从操作数栈弹出,保存到索引为1的局部变量a中2:新建一个StringBuilder5:复制之前的新空格,压入操作数栈6:调用初始化9:将结果保存到操作数栈10:调用StringBuilder.append(java/lang/Object)13:将“456”压入栈顶15:StringBuilder.append(java/lang/String)18:执行toString函数从上面的分析可以看出,它最终先变成了一个StringBuilder对象,后面的“+”运算符调用StringBuilder.append()来执行“+”。解释为什么上面的示例程序运行后为null456。附加对象时,publicstaticStringvalueOf(Objectobj){return(obj==null)?"null":obj.toString();}被调用以将对象转换为字符串。为什么JAVA不支持运算符重载?与C++中的类一样,运算符被重载。个人认为这会是运维中很少见的问题,因为没有标准来约束算子重载。每个人都可以认为这是理所当然的。重载会导致语义和可读性的很大差异。性能严重下降,所以java中去掉运算符重载的特性和他先进的面向对象很吻合。所以,不用担心这个问题。后记这些是在开发过程中经常用到的一些东西,但是在平时的开发过程中可能没有挖掘到那么深,也就习以为常了。后面可以尝试不断挖掘这些没有被发现的小案例。