目录
在Java程序中,不同的基本数据类型(只有7种,不包含boolean类型)变量的值经常需要进行相互转换。转换的方式有两种:自动类型提升和强制类型转换。
规则:将取值范围小(或者容量小)的类型自动提升为取值范围大(或容量大)的类型。
①:当把存储范围小的值(常量值、变量的值、表达式计算的结果值)赋值给了存储范围大的变量时
int i = 'A';? ? ?//char自动升级为int,其实就是把字符的编码值赋值给i变量了
double d = 10;? ? ?//int自动升级为double
long num = 123456;? ? ? //右边的整数常量值如果在int范围呢,编译和运行都可以通过,这里涉及到数据类型转换
//byte bigB = 130;? ? ? //这个是错误的,因为右边的整数常量值超过byte范围
long bigNum = 1234568912L;? ? //右边的整数常量值如果超过int范围,必须加L,显式表示long类型,否则编译不通过
②:当存储范围小的数据类型与存储范围大的数据类型变量一起混合运算时,会按照其中最大的类型运算
int i = 1;
byte b = 1;
double d = 1.0;
double sum = i + b + d;? ? ? //混合运算,升级为double
③:当byte,short,char数据类型的变量进行算术运算时,按照int处理
byte b1 = 1;
byte b2 = 2;
byte b3 = b1+b2;? ? ? ? ? //编译报错,b1+b2自动升级为int
char c1 = '0';
char c2 = 'A';
int i = c1 + c2;? ? ? ?//至少需要使用int类型来接收
System.out.println(c1+c2);? ? ? ? ?//113
将3.14赋值到int类型变量会发生什么?产生编译失败,肯定无法赋值。
int i = 3.14;? ? ? ?//编译报错
想要赋值成功,只有通过强制类型转换,将double类型强制转换成int类型才能赋值
规则:将取值范围大(或容量大)的类型强制转换成取值范围小(或容量小)的类型。
自动类型提升是Java自动执行的,而强制类型转换是自动类型提升的逆运算,需要我们自己手动执行。
转换格式:
数据类型1 变量名 = (数据类型1)被强转数据值;? ?//()中的数据类型必须 <= 变量值的数据类型?
①:当把存储范围大的值(常量值、变量的值、表达式计算的结果值)强制转换为存储范围小的变量时,可能会损失精度或溢出。
int i = (int)3.14;? ? ? ?//损失精度
double d = 1.2;
int num = (int)d;? ? ? ? ? //损失精度
int i = 200;
byte b = (byte)i;? ? ? ? //溢出
②:当某个值想要提升数据类型时,也可以使用强制类型转换。这种情况的强制类型转换是没有风险的,通常省略。
int i = 1;
int j = 2;
double bigger = (double)(i/j);
③:声明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的值到底是123l还是123L对应的取值12,就会出现歧义
long l = 123L;
String不是基本数据类型,属于引用数据类型
使用一对""来表示一个字符串,内部可以包含0个、1个或多个字符
声明方式与基本数据类型类似。例如:String str = "大帅哥";
①:任意八种基本数据类型的数据与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);? ? ? ? ?//编译通过
②:String类型不能通过强制类型()转换,转为其他的类型
String str = "123";
int num = (int)str;? ? ? ? ? ?//错误的
?
int num = Integer.parseInt(str);? ? ? ? //正确的,后面会涉及到,借助包装类的方法可以转