2012年1月10日

地址:https://irusist.github.io


!





posted @ 2015-12-31 00:37 irusisit 阅读(74) | 评论 (0)编辑 收藏
 
    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)的方法。

 

posted @ 2012-01-10 22:35 irusisit 阅读(188) | 评论 (0)编辑 收藏