JAVA提供的“+”运算符,如Iteger+String,从C++的角度来看总是想找到JAVA是怎么重载这个“+”运算符,于是进去String这个类中看,然而并没有什么卵发现,于是乎想着JAVA是怎么做到的?下面来为你逐步分析下JAVA是怎么实现“+操作符重载的”。

成都创新互联公司是一家专业提供城中企业网站建设,专注与网站建设、做网站、成都h5网站建设、小程序制作等业务。10年已为城中众多企业、政府机构等服务。创新互联专业网络公司优惠进行中。
示例
- public class Example {
 - public static void main(String[] args) {
 - Integer a = null;
 - String b = a + "456";
 - System.out.println(b);
 - }
 - }
 
这个程序很简单就是一个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."
 ":()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."
 ":()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函数部分:
从上面的分析我们可以看到其最终是先生成了一个StringBuilder对象,之后的“+”操作符都是调用了StringBuilder.append()进行“+”的。这就可以解释上面示例程序运行后为什么是null456了,append object的时候调用了
- public static String valueOf(Object obj) {
 - return (obj == null) ? "null" : obj.toString();
 - }
 
将object转化为String了。
为什么JAVA不支持操作符重载
像C++中类对操作符进行了重载,个人觉得会操作维护难得问题,因为操作符重载没有一个标准来约束大家都可以想当然的进行重载会造成语义相差大,可读性严重降低,所以java中去掉操作符重载这个特性和他的高级面向对象很相符。so,不纠结这个问题。
后记
这都是在开发过程中会经常使用的一些东西但是可能在平时开发过程中没有挖的这么深入,都想当然了,后面可以尝试不断挖掘这些不被发现的小case。
Copyright © 2009-2022 www.wtcwzsj.com 青羊区广皓图文设计工作室(个体工商户) 版权所有 蜀ICP备19037934号