JAVA语法糖“+”运算符
JAVA 语法 运算符
2023-09-27 14:21:44 时间
JAVA提供的“+”运算符,如Iteger+String,从C++的角度来看总是想找到JAVA是怎么重载这个“+”运算符,于是进去String这个类中看,然而并没有什么卵发现,于是乎想着JAVA是怎么做到的?下面来为你逐步分析下JAVA是怎么实现“+操作符重载的”。
示例
这个程序很简单就是一个Integer和String的“+”运算表达式。运行结果:null456
反编译示例程序
命令:
javap -c Example
反编译后的结果如下:
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函数部分:
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的时候调用了
为什么JAVA不支持操作符重载
像C++中类对操作符进行了重载,个人觉得会操作维护难得问题,因为操作符重载没有一个标准来约束大家都可以想当然的进行重载会造成语义相差大,可读性严重降低,所以java中去掉操作符重载这个特性和他的高级面向对象很相符。so,不纠结这个问题。
后记
这都是在开发过程中会经常使用的一些东西但是可能在平时开发过程中没有挖的这么深入,都想当然了,后面可以尝试不断挖掘这些不被发现的小case。
作者:liutxer
来源:51CTO
相关文章
- Java GC系列
- Java语言基本语法
- Java 常用语法和数据结构
- Java线程池架构(二)多线程调度器
- Java 注解讲解
- 第90节:Java中的Linux基础
- Java Opencv 实现 中值滤波器
- java学习笔记--java中的基本数组[5]
- java——Arrays.asList()方法
- 十分钟让你明白Objective-C的语法(和Java、C++的对比)
- java线程池
- java入门02---随机数输出
- java安全编码指南之:异常处理
- java 8 Streams简介
- 下载eclipse 配置eclipse 新建Java项目 写一个小程序 运行
- java工具类学习,系统中用户密码加密总结
- Java基础篇:反射机制详解
- Java基础语法
- 【JAVA】正则表达式及其相关的方法和对象
- JAVA学习(三):Java基础语法(变量、常量、数据类型、运算符与数据类型转换)
- Java千百问_03基本的语法(005)_二进制是如何做位运算的
- JavaSE入门学习6:Java基础语法之运算符和语句(上)
- Thymeleaf常用语法:模板文件中表达式调用Java类的静态方法
- Java学习路线:day3 Java基本语法(上)2
- Java学习路线:day2 Java基本语法(上)