java是一门强类型语言,当不同类型之间的变量相互赋值时,会有严格的校验。当类型不一致时,就会发生类型的转换。java中类型转换分为两类:自动类型转换和强制类型转换。
造型(casting)的含义是把一种类型的值赋给另一种类型的变量。
基本数据类型和引用数据类型的变量都可以进行造型。但基本类型和引用类型变量之间不能相互转换。
1.基本数据类型转换
常见基本数据类型范围的大小
这是java中常见的7种基本数据类型之间的范围大小关系,这7种基本数据类型之间存在类型转换。
1.1.自动(隐式)类型转换
从小类型到大类型,不需要强制转换符。
int a = 10;
long b = 20;
long c = a + b;
在这段代码中,计算的c一定是先将a进行数值提升为long类型再与b进行加运算。
1.2.强制类型转换
从大类型到小类型,需要强制转换符实现强制转换。
格式:范围小的数据类型 范围小的变量名 = (范围小的数据类型)范围大的数据类型
long a = 10;
int b = (int)a;
注:
1).强制类型转换一般不推荐使用,因为可能会发生精度丢失,数据溢出。
2).强制类型转换不是一定能成功,互不相干的类型之间无法强转,(如int和boolean是不兼容的类型)。
易错:
byte和byte的运算
byte a = 10;
byte b = 20;
byte c = a + b;
System.out.println(c); //会编译报错:不兼容的类型:从int转换到byte可能会有损失。
原因:虽然a和b都是byte,但是计算a + b会先将a和b都提升成int再计算,得到的结果也是int,这时赋值给a,就会出现上述错误。
结论:由于计算机的CPU通常是按照4个字节为单位从内存中读写数据,为了硬件上实现方便,诸如byte和short这种低于4个字节的类型,会先提升成int,再参与计算。
正确写法:
byte a = 10;
byte b = 20;
byte c = (byte)(a + b);
System.out.println(c);
PS:
public class Test { public static void main(String[] args) { int a = Integer.MAX_VALUE; long b = a + 1L; int c = (int) b; System.out.println(b); } }
public class Test { public static void main(String[] args) { int a = Integer.MAX_VALUE; long b = a + 1L; int c = (int) b; System.out.println(c); } }
类型提升:
1).不同类型的数据混合运算,范围小的会提升为范围大的。
2).对于short,byte这种比4个字节小的类型,会先提升成4个字节的int,再运算。
2.引用数据类型转换
引用数据类型的转换是有条件的,不能够随便转。转换的条件是:只能够在有继承关系的类型间进行。正因为只能沿着继承树进行转换,才有向上转型和向下转型的概念。(在多态介绍中详细讲解)
2.1.自动类型转换——把子类对象交给父类的引用(向上转型)
2.2.强制类型转换——把父类对象交给子类的引用(向下转型)
3.int和String之间的相互转换
3.1.int转成String
int num = 10;
//方法1
String str1 = num + "";
//方法2
String str2 = String.valueof(num);
3.2.String转成int
String str = "100";
int num = Integer.parseInt(str);