java虚拟机处理byte,short,char,int类型之间的“+”操作都是将他们转化成int类型,压入操作数栈,用int类型来做加法操作的,当java程序中有还有long,float,double中的一种时,会转化成他们之中优先级最高的,优先级从long,float,double依次增高。boolean类型与上面所说的4种类型进行"+"运算,编译报错不通过。基础类型与String以外的引用类型进行"+"操作时,编译器报错不通过。 当两个非String的引用类型进行“+”操作时,编译器会报错不通过。
当byte,short,int类型与String的引用类型进行“+”操作时,比如,在一个静态方法里定义如下:
byte b = 127; String str1 = "string";
String str = b + str1;
产生的字节码为:
0: bipush 127
2: istore_1
3: ldc #2; //String string
5: astore_2
6: new #3; //class java/lang/StringBuilder
9: dup
10: invokespecial #4; //Method java/lang/StringBuilder."<init>":()V
13: iload_1
14: invokevirtual #5; //Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
17: aload_2
18: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
21: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/lang/String;
24: astore_3
25: return
可见,String对象的与byte进行“+”操作会先生成一个StringBuilder(jdk5以后,jdk5以前是StringBuffer)对象,将byte类型转换为int类型传入StringBuilder.append(int)的方法内,再将String对象传入StringBuilder.append(String)方法内,最后调用这个StringBuilder对象的toString方法得到String对象。同理,short,boolean,long,float,double类型,引用类型与String对象进行“+”操作也是同样处理,分别调用StringBuilder的不同参数的重载方法,不过char对象与short会有所不同,他不会转换成int类型,而是直接将char类型的值传递给StringBuilder的append(char)的方法。