关于类型转换
一般规律:小类型向大类型可以自动类型转换,而大类型向小类型转换,需要手动的强制类型转换。
注意:
1.类型的大小不是按字节大小区分的,而是按照它的范围来定的,比如
long long1 = 300F;//报错,编译无法通过
float float1 = 300L;//编译可以通过,并且可以正常运行
long占八个字节,float占四个字节,但实际上float表示的范围要比long更大,(这主要是底层采用存储方式不同造成的)所以long类型的常量可以赋值给float类型的变量,而反过来却不行。
2.这个规则也可以用在引用数据类型上,如果是引用类型,类型的大小则由他们的继承或实现关系来决定。
关于自动java中编译器做的自动强制类型转换
byte byte1 = 1;
short short1 = 2;
char char1 = 3;
类似上面的代码,相信大家都写过,实际上,也能编译通过,并且正常运行。但是,如果作为初学者,不应该有疑惑吗?java中的整型常量是int类型的,将一个int类型的常量,赋值给byte、short或char类型的变量,却不会报错??不是小类型才可以进行自动类型转换转为大类型的吗?大类型的转小类型需要进行强制类型转换,并且可能会损失精度的。这里是为什么呢?
其实是java中有一种机制:只要一个int类型的常量,在byte、short或char类型的范围之类的,就可以直接赋值给byte、short或char的变量,检查工作是java的编译器自动进行的。
注意:
1.只能是常量,不能是变量或变量参与运算的表达式。
byte byte1 = 1;
short short1 = 2;
char char1 = 3;
int int1 = 3;
short short2 = byte1 + 1;//报错,编译无法通过
short short3 = int1;//报错,编译无法通过
short short4 = 3;//编译通过,并且可以正常运行
因为java编译器只会自动检测字面常量是否超出了类型的范围,而不会对变量的值或有变量参与的运算结果进行检测。
“short short2 = byte1 + 1;”在做运算的时候,会自动上升为int类型,然后编译器就会检测到结果是一个int类型的值,而前面的变量是一个short类型的。不是小类型转大类型,所以直接编译报错。
“short short3 = int1;” 直接通过变量的类型就有问题,而不会通过上下文来判断值是否超出了范围。
2.对于纯常量的表达式,也是可以的
short short4 = 1 + 2;//编译通过,并且可以正常运行
因为简单的常量表达式,java的编译器可以直接就运算出结果,然后再进一步检测是否超出了范围。
3.这个机制只是针对int转byte、short或char
float float1 = 3.14;//报错,编译无法通过
对于其它的基本数据类型或引用数据类型,是没有这个机制的,只能使用文章开头说的一般规律。
其它一些简单的测试,比如超出范围就会编译报错.