自动类型转换
- 把一个取值范围小的数值或者变量,赋值给另一个取值范围大的变量,也就是精度低的类型赋值给精度高的类型,这种情况不可能导致精度丢失,所以这种类型转换是隐式的或者说是自动的。
- 这一过程也叫向上转型
- 还有一种特殊情况是byte类型的变量,因为这个类型的变量本身范围就较小,所以一旦进行运算就是自动转型为int类型。
// 阅读代码, 分析是否存在错误, 如果有请说明原因并改正.
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2
这段代码运行是会报错的
package com.itheima.test;
public class TypeChangeTest {
/*
阅读代码, 分析是否存在错误, 如果有请说明原因并改正.
byte b1 = 3;
byte b2 = 4;
byte b3 = b1 + b2;
原因: b1和b2是两个byte类型的数据, 相加的时候会直接提升为int, 提升之后就是两个int相加
结果还是int这里将int类型的结果, 赋值给byte类型的变量
属于大的给小的赋值, 不能直接赋值, 需要强转, 或者改变类型.
改正:
1. byte b3 = (byte)(b1 + b2);
2. int b3 = b1 + b2;
byte b = 3 + 4;
回答: 这句代码不会出现错误, Java存在字面量优化机制, 在编译的时候(javac)就会完成运算
字节码文件: byte b = 7;
*/
public static void main(String[] args) {
byte b = 3 + 4;
System.out.println(b);
}
}
- 同样的,下面这段代码也会报错,short在做运算的时候也会自动向上转型为int
short a = 10 ;
short b = 20 ;
short c = a + b;
强制类型转换
- 强制类型转换一般用于高精度类型向低精度类型转换,但这很容易导致精度丢失,在开发中要尽量少用
- 在变量的前面使用括号可以进行强制类型转换
int a = (int)2.5; //2
int c = (double)3 // 3.0
- 在编写代码中如果要对算术运算的式子的结果进行强制类型转换,记得加括号
int result1 = (int)7/2.5; //这样写会报错,java会很疑惑强制类型转换是给整数7的还是给式子7/2.5的
//报错信息如下
// 需要的类型:
//int
//提供的类型:
//double
//我们给代码添加上括号
int result1 = (int)(7/2.5); //result1 = 2
隐式强制类型转换
- 有些时候也会发生隐式强制类型转换,例如这样:
nt a = 10 ;
a += 13.14;//a = a + 3.14
- 代码是可以编译通过的,输出结果为23,发生了精度丢失,
a+3.14发生自动向上转型,从int+double的运算,转换为double的运算结果,当将a+3.14的运算结果赋值回a的时候,就发生了隐式强制类型转换,从double转换为int,精度发生丢失