Java中的自动类型转换

154 阅读3分钟

在学习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~1271
short-32768 - 327672
int-2^31 - 2 ^ 31 - 14
char0~ 655352