在学习Java基础数据类型中,涉及一些自动类型转换的注意点,需要我们注意。 我们都知道,Java中基础数据类型分为四类八种
整型: byte、short、int、long
浮点型: float、double
字符型:char
布尔型:boolean
当数据类型不一致时,需要进行类型转换
类型转换分为两种:
1.自动类型转换
2.强制类型转换
1、自动类型转换(隐式)
- 由范围小的数据类型转换为范围大的数据类型(从小到大)
- 特点:不需要特殊处理,自动完成
- 注意:任何一个整数都可以赋值给浮点型变量,但是可能会出现精度损失
2、 强制类型转换(显示)
- 由范围大的数据类型转换为范围小的数据类型(从大到小)
- 特点:需要程序员手动处理,否则编译不通过
- 格式:范围小的数据类型 变量名 = (范围小的数据类型)范围大的数据值;
- 强制类型转换有可能会出现精度损失
- 把浮点型转换为整型时,需要强制转换。当小数转换成整数时,不是四舍五入,而是直接舍弃掉小数部分。
- 对于char/byte/short来说,如果右侧赋值没有超出范围,那么jvm会自动补全一个强制类型转换
- byte/short/char在进行运算或赋值 时会提升为int类型再进行计算
// char 类型也能进行运算。会提升为int类型再进行计算
public static void main(String[] args) {
char c1 = '中';
System.out.println(c1 + 1);
// byte/short/char在进行运算或赋值时 会提升为int类型再进行计算
byte num1 = 20;
byte num2 = 10;
// num1 和 num2 自动提升为int。
// byte(小) = int(大) 所以需要强制类型转换
byte num3 = (byte)(num1 + num2);
byte num4 = 10;
short num5 = 100;
// short(小) = int(大)
short num6 = (short) (num4 + num5);
// 对于char/byte/short来说,如果右侧赋值没有超出范围,那么jvm会自动补全一个强制类型转换
// 如果数值超出范围,就编译失败,只能强制类型转换
// byte(小) = int(大)
byte num7 = 10; // 相当于 byte num7 = (byte)10;
byte num8 = (byte) 128; // 相当于 byte num8 = (byte) 128;
System.out.println(num8); // -127 超出范围,回到最开始 byte(-128-127)
char c3 = 'a';
short = char
short s1 = c3;// 编译失败
// 当编译到28行时确定c3的值是a,此时,将a强制转换成int类型,值为97。没有超过short的范围。所以编译成功。
// 因为编译器是一行行分开编译的。到29行时,编译器只能确定c3是char类型,不确定c3的值。此时编译器判断二者类型不同,需要强制转换才能编译通过
}
自增运算中隐含的强制类型转换
// 自增运算符
byte num1 = 3;
// 注意:在运算完成之后,java底层会对结果做一次强制类型转换
num1++; // 相当于 num1 = (byte)(num1 + 1);
System.out.println(num1);
// 测试
byte num2 = 127;
num2++;
System.out.println(num2);// -128 相当于num = (byte)128。超出byte的表示范围,再次回到表示范围的最开始
// 注意:扩展运算符中包含了一个强制类型转换
byte num1 = 10;
num1 += 10;// num1 = (byte)(num1 + 10);
System.out.println(num1);
因此我们最好记住几个最常见类型的表示范围,以免犯下低级错误
| 类型 | 表示范围 | 占字节数 |
|---|---|---|
| byte | -128~127 | 1 |
| short | -32768 - 32767 | 2 |
| int | -2^31 - 2 ^ 31 - 1 | 4 |
| char | 0~ 65535 | 2 |