JAVA提供的“+”运算符,如Iteger+String,从C++的角度来看总是想找到JAVA是怎么重载这个“+”运算符,于是进去String这个类中看,然而并没有什么卵发现,于是乎想着JAVA是怎么做到的?下面来为你逐步分析下JAVA是怎么实现“+操作符重载的”。
示例
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."<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的时候调用了
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
将object转化为String了。
为什么JAVA不支持操作符重载
像C++中类对操作符进行了重载,个人觉得会操作维护难得问题,因为操作符重载没有一个标准来约束大家都可以想当然的进行重载会造成语义相差大,可读性严重降低,所以java中去掉操作符重载这个特性和他的高级面向对象很相符。so,不纠结这个问题。
后记
这都是在开发过程中会经常使用的一些东西但是可能在平时开发过程中没有挖的这么深入,都想当然了,后面可以尝试不断挖掘这些不被发现的小case。

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

PhpStorm versi Mac
Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

ZendStudio 13.5.1 Mac
Persekitaran pembangunan bersepadu PHP yang berkuasa

Muat turun versi mac editor Atom
Editor sumber terbuka yang paling popular

SecLists
SecLists ialah rakan penguji keselamatan muktamad. Ia ialah koleksi pelbagai jenis senarai yang kerap digunakan semasa penilaian keselamatan, semuanya di satu tempat. SecLists membantu menjadikan ujian keselamatan lebih cekap dan produktif dengan menyediakan semua senarai yang mungkin diperlukan oleh penguji keselamatan dengan mudah. Jenis senarai termasuk nama pengguna, kata laluan, URL, muatan kabur, corak data sensitif, cangkerang web dan banyak lagi. Penguji hanya boleh menarik repositori ini ke mesin ujian baharu dan dia akan mempunyai akses kepada setiap jenis senarai yang dia perlukan.

Versi Mac WebStorm
Alat pembangunan JavaScript yang berguna