Day03 Java的强制类型转换

四. 强制类型转换

  • 因为Java是强类型语言,所以我们在进行一些计算的时候就会需要用到类型转换。

  • Java的类型转换分为一下两种

    • 强制类型转换
    • 自动类型转换

    运算中,不同类型的数据先转化为同一类型,然后进行运算。Java在类型转换时遵循一下原则,从低等级转换到高等级为自动转换,反之则需要强制转换。Java的j基础数据类型从低到高排序如下

    byte --> short,char --> int --> long --> float --> double

    注:boolean 类型不参加强制转换

    强制类型转换的语法为 (类型名)[需要转换的变量],例子如下

    //自动类型转换
    byte by = 1;
    int a = by; //正确
    //强制类型转换
    int i = 127;
    byte b = (byte)i; 
    

    从高类型转换到低类型的时候需要注意溢出问题和精度问题,如下例子:

    //从高到低内存溢出的例子
    int i = 128;
    byte by = (byte)i; //输出值为-128
    
    //从高向低出现精度问题的例子
    double d = 12.34;
    float f = -34.52F;
    int i1 = (int)d; //值为12
    int i2 = (int)f; //值为-34
    
  • 总结:

    1. 不能对布尔值进行转换
    2. 不能将对象转换为不相干的类型
    3. 把高容量转换到低容量需要进行强制转换
    4. 高容量到低容量进行强制转换时可能出现内存溢出或者精度问题。
  • 其他的一些问题

    看如下的一个程序:

    //一个运算溢出的例子
    int salary = 10_0000_0000;//JDK7支持使用下划线分割数字,更易阅读
    int years = 20;
    int total1 = salary * years; //薪水的总和,显而易见的超过了int所能表示的范围
                                 //他的输出是-1474836480
    System.out.println(total1);
    
    long total2 = salary * years;  //换用long储存,依旧输出同样的结果
    System.out.println(total2);
    

    ​ 产生这个结果的原因是是两个操作数的类型都是int,所以他们计算得出的结果为int,产生了溢出,而赋值号将等式右边的值赋给等式左边,由于表达式从左到右的运算规则,赋值给右方的值已经是错误的值,所以即使换用更大的类型储存,输出的值仍然是错误的结果。一种可行的修改方法如下:

    long total3 = salary * (long)years;
    System.out.println(total3);    //正确输出结果20000000000
    
posted @ 2021-02-17 22:33  心叶酱  阅读(123)  评论(0编辑  收藏  举报