偶尔碰到一些感觉很常见但是碰到了却又有些模糊的问题,然后花了点时间一下性解决下,写下来以后回来再看。
直接看代码分析吧
1 package myInterviewProgram; 2 public class TestByte { 3 /* 4 * 首先表达式转型注意以下规则: 5 ①所有的byte,short,char型的值将被提升为int型; 6 ②如果有一个操作数是long型,计算结果是long型; 7 ③如果有一个操作数是float型,计算结果是float型; 8 ④如果有一个操作数是double型,计算结果是double型; 9 首先2个byte类型相加,会自动提升为int,计算的结果也是int因此需要强制转化会byte, 10 而被fianl修饰的变量不会改变,会被JVM优化,当2个final修饰相加时候会根据左边变量的类型而转化, 11 作为这2个final变量的最终类型。 12 */ 13 /* 14 * 基本数据类型转换: 15 各数据类型按容量大小(表数范围大小)由小到大排列为: 16 Byte, short, char ——int ——long——float——double 17 1.转换时遵循的原则: 18 1)容量小的类型自动转换为容量的类型; 19 2)容量大的类型转换为容量小的类型时,要加强制转换符; 20 3)byte,short,char之间不会互相转换,并且三者在计算时首先转换为int类型; 21 4)实数常量默认为double类型, 整数常量默认为int类型; 22 */ 23 public static void main(String[] args){ 24 25 byte a =1,b=2,l=127; 26 final byte e=3,f=4,t=127; 27 int k = 3; 28 //先来最基本的: 29 // a = k;//编译错误,int型赋值给byte需要强制类型转换 30 k = a;//编译通过,byte可以直接转换成为int型及以上基本数据类型 31 System.out.println(k); 32 33 int x = a+b;//编译通过,两个byte型数据相加自动转换为int型 34 // byte x1 = a+b;//这句报错,因为byte类型数据在计算时会自动转换成为int型参与计算,所以a+b得到的结果是int型的 35 byte x1 = (byte) (a+b);//int型强转byte,精度会丢失 36 37 byte x2 = a++;//编译通过 38 int x3 = a++;//编译也通过 39 byte x4_ = ++l;//编译居然通过了,结果为-128,其实是先转换成了int型结果自增为128,但是byte型范围最大为127,底层自动发生了向下转换,丢失了精度。 40 // byte x4 = 1++;//编译不通过,说明++操作底层也是自动转换了int型 41 // byte x4 = e++;//编译不通过 42 // byte x4 = ++t;//编译不通过,通过与上一条语句对比说明,经过final修饰的byte基本数据类型变量,经过++、--操作都不能赋值给非final。 43 44 // byte x5 = a+1;//编译不通过,原因:1为int型,与byte型数据相加结果自动转int 45 byte x5 = 1+2;//编译通过了,首先要注意1、2这是两个常量,编译器会直接将这两个常量相加后赋值, 46 //相当于直接赋值操作,所以正确。 47 System.out.println(x4_); 48 49 int y = e+f;//编译通过 50 byte y1 = e+f;//编译也通过,说明当两个byte型都被final修饰时,相加byte,int都是正确的。我们可以这样理解,经过final修饰 51 //的变量是不可改变的,所以可以当常量处理,相当于先计算了两个byte常量值,再将结果赋值给左边的变量,也就是初始化操作。 52 //必须要说明的,当e+f的结果超过byte范围-128-127时,此时赋值就会报错。 53 54 int z = a+e;//编译通过 55 // byte z1 = a+e;//报错,通过对比说明只要有byte型数据相加,都会发生向上转型为int,不管其中是否一个是final 56 byte z1 = (byte) (a+e);//可以通过强转型 57 // System.out.println(x2); 58 59 } 60 }
总结下:
1、对于数据类型的相加,当操作数是byte,short,char时,会自动转化为int类型;返回结果为int。当操作数是int,long时,不转化,原来是啥类型,还是啥类型。
2、对于有final修饰的基本数据类型,当两个操作数都被final修饰,可以直接当常量处理,例如相加操作,会直接相加取结果再如初始化方式赋值,所以左边变量数据类型只要是在结果范围类都是正确的;当两个操作数有一个不是final,最后会将结果转换为int型,如果左边不是int型变量,需要转换数据类型。
3、对于++、--操作,经过final修饰的变量不能直接赋值给非final型,否则直接报错。。但是允许其中一个是final型,只不过最后结果是int型,需要强转。