一:类型转换
Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验,当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式) 和 强制类型转换(显式)。
比如:
public static void main(String[] args) {
int little=10;
long big=1L;
little=big;//little装不下big,IDEA会提示出错
}
little是int型,有4个字节,而big是long类型,有8个字节。要把big赋值给little显然是装不下的(不看初始值大小,只关注数据类型本身大小),会造成数据丢失的后果。
此时如果非要让他们相等(因为我们是知道big的初始值是不大于int类型的范围,所以不担心丢失数据),就需要用到强制类型转换:
public static void main(String[] args) {
int little=10;
long big=1L;
little=(int) big;//强制使big变成int类型,这样就塞得下了
}
当然,强制类型转换不一定安全,如果big的值超过int类型的范围,就会发生错误,此时是否要强制转换就要看我们本身的需求了。
注:
- 如果要把float类型赋值给int类型,也需要强制转换,虽然他俩都是4个字节,但因为float可以表示小数,它所表示的数据精度就更高。也可以认为浮点型范围大于整型。
- 强制类型转换不一定能成功,不相干的类型不能互相转换。比如boolean和int就不能转换。
自动类型转换(隐式):代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。特点:数据范围小的转为数据范围大的时会自动进行。
即,上面如果把little赋值给big,编译器就不会报错,而是自动将little提升为long类型,然后赋值。
二:类型提升
在不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。
比如:
public static void main(String[] args) {
int a = 10;
long b = 20;
int c = a + b; // 编译出错
//改正方法:
int c=(int) (a+b);// 编译成功
long d = a + b; // 编译成功
}
其中,a+b 的时候,是 int 类型+ long 类型,系统会自动提升为 long+long ,而 c 是 int 类型,放不下 long 类型所以会出错。
又比如:
public static void main(String[] args) {
byte a = 10;
byte b = 20;
byte c = a + b;//编译出错
//改正方法:
byte c = (byte)(a + b);
}
此处 byte 和 byte 都是相同类型, 但是计算 a + b 系统还是会先将 a 和 b 都提升成 int, 再进行计算, 得到的结果也是 int, 这是赋给 c, 就会出现上述错误。
这是由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据.,为了硬件上实现方便,诸如 byte 和 short 这种低于 4 个字节的类型,会先提升成 int, 再参与计算。
2.1:String类型的特殊规则
在Java中任意类型+字符串都会被转换为字符串类型,比如:
public static void main(String[] args) {
int a=10;
int b=333;
System.out.println("a="+a);
System.out.println("b="+b);
}
运行结果为:
那么再看下面的情况,思考一下(注:Java代码都是从左往右运行的),让我们加深一下理解:
public static void main(String[] args) {
int a=10;
int b=333;
System.out.println("a+b="+a+b);//这里应该输出什么?
}
运行结果为:
我们可以再考虑一下,如果是下面两种情况,输出结果会是什么呢?结果我会打在评论区,看看对不对。
System.out.println("a+b="+(a+b));
System.out.println(a+b+"是a+b的值");