基本数据类型变量间运算规则
在Java程序中,不同的基本数据类型(只有7种,不包含boolean类型)变量的值经常需要进行相互转换。
转换的方式有两种:自动类型提升
和强制类型转换
。
一.自动类型提升
规则:将取值范围小(或容量小)的类型自动提升为取值范围大(或容量大)的类型 。
(1)当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时
(2)当存储范围小的数据类型与存储范围大的数据类型变量一起混合运算时,会按照其中最大的类型运算。
(3)当byte,short,char数据类型的变量进行算术运算时,按照int类型处理。
二 .强制类型转换
将3.14
赋值到int
类型变量会发生什么?产生编译失败,肯定无法赋值。
int i = 3.14; // 编译报错
想要赋值成功,只有通过强制类型转换
,将double
类型强制转换成int
类型才能赋值。
规则:将取值范围大(或容量大)的类型强制转换成取值范围小(或容量小)的类型。
自动类型提升是Java自动执行的,而强制类型转换是自动类型提升的逆运算,需要我们自己手动执行。
(1)当把存储范围大的值(常量值、变量的值、表达式计算的结果值)强制转换为存储范围小的变量时,可能会损失精度
或溢出
。
int i = (int)3.14;//损失精度 double d = 1.2; int num = (int)d;//损失精度 int i = 200; byte b = (byte)i;//溢出
(2)当某个值想要提升数据类型时,也可以使用强制类型转换。这种情况的强制类型转换是没有风险
的,通常省略。
int i = 1; int j = 2; double bigger = (double)(i/j);
(3)声明long类型变量时,可以出现省略后缀的情况。float则不同。
long l1 = 123L; long l2 = 123;//如何理解呢? 此时可以看做是int类型的123自动类型提升为long类型 //long l3 = 123123123123; //报错,因为123123123123超出了int的范围。 long l4 = 123123123123L; //float f1 = 12.3; //报错,因为12.3看做是double,不能自动转换为float类型 float f2 = 12.3F; float f3 = (float)12.3;
问答:为什么标识符的声明规则里要求不能数字开头?
//如果允许数字开头,则如下的声明编译就可以通过: int 123L = 12; //进而,如下的声明中l的值到底是123?还是变量123L对应的取值12呢? 出现歧义了。 long l = 123L;
三. 基本数据类型与String的运算
1 .字符串类型:String
-
String不是基本数据类型,属于引用数据类型
-
使用一对
""
来表示一个字符串,内部可以包含0个、1个或多个字符。 -
声明方式与基本数据类型类似。
2. 运算规则
1、任意八种基本数据类型的数据与String类型只能进行连接“+”运算,且结果一定也是String类型
System.out.println("" + 1 + 2);//12 int num = 10; boolean b1 = true; String s1 = "abc"; String s2 = s1 + num + b1; System.out.println(s2);//abc10true //String s3 = num + b1 + s1;//编译不通过,因为int类型不能与boolean运算 String s4 = num + (b1 + s1);//编译通过
2、String类型不能通过强制类型()转换,转为其他的类型
String str = "123"; int num = (int)str;//错误的 int num = Integer.parseInt(str);//正确的,借助包装类的方法才能转