【一步一步了解Java系列】:探索Java基本类型转换的秘密

发布于:2024-05-07 ⋅ 阅读:(27) ⋅ 点赞:(0)

看到这句话的时候证明:此刻你我都在努力~

                                加油陌生人~

                                

个人主页:  Gu Gu Study    

                                              ​​

专栏:一步一步了解Java

喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹。

如果喜欢能否点个赞支持一下,谢谢啦!

                                                                                                                作者:小闭


 
Java 中的类型转化

在 Java 中,类型转化是一种常见的操作,它允许我们将一种数据类型转换为另一种数据类型。类型转化可以分为自动类型转换和强制类型转换。

int a = 10;
long b = 100L;
b = a; // 可以通过编译
a = b; // 编译失败

看上上面的代码是否有了那么一些疑惑了呢?至于为什么,下面的知识会给你答案! 


一、自动类型转换

自动类型转换是指在不丢失信息的情况下,将一种数据类型自动转换为另一种数据类型。这种转换通常发生在取值范围较小的数据类型向取值范围较大的数据类型转换时。(代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。


 
1.1 自动类型转换(隐式)
 

 例如:byte转化为int类型

byte b = 10;
int i = b;  // 自动类型转换

这里byte的取值范围是比int型的取值范围小所以是可以完成自动类型转换

public class Test {
    public static void main(String[] args) {


        System.out.println(18);// 整型默认情况下是int
        System.out.println(18.8); // 浮点型默认情况下是double

        int a = 100;
        long b = 10L;
        b = a; // a和b都是整形,a的范围小,b的范围大,当将a赋值给b时,编译器会自动将a提升为long类型,然后赋值
        a = b; // 编译报错,long的范围比int范围大,会有数据丢失,不安全
        float f = 3.14F;
        double d = 5.12;
        d = f; // 编译器会将f转换为double,然后进行赋值
        f = d; // double表示数据范围大,直接将float交给double会有数据丢失,不安全
        byte b1 = 100; // 编译通过,100没有超过byte的范围,编译器隐式将100转换为byte
        byte b2 = 257; // 编译失败,257超过了byte的数据范围,有数据丢失
    }
}

因为现在的编译器功能都比较强大所以,这里编译器已经将错误的地方都给标红了,我们是很容易看出来哪里是错误的。当然注释里也是很明确地写出来错误的原因了。

二、强制类型转换

2.1强制类型转换(显式)

强制类型转换是指通过显式的操作将一种数据类型强制转换为另一种数据类型。这种转换可能会导致信息丢失或数据错误,因此需要谨慎使用。

有小伙伴可能就会疑惑那如果我非要强制将取值范围大的转换为取值范围小的类型,有没有办法呢,有那就是强制类型转换,当然它也可以将取值范围小的类型强制转换为取值范围大的数据类型。
 
强制类型转换的语法为: (目标类型)值 。
 
需要注意的是,在进行强制类型转换时,如果转换后的结果超出了目标类型的取值范围,可能会导致数据异常。
 

public class Test {
    public static void main(String[] args) {

        int a = 10;
        long b = 100L;
        b = a; // int-->long,数据范围由小到大,隐式转换
        a = (int)b; // long-->int, 数据范围由大到小,需要强转,否则编译失败
        float f = 3.14F;
        double d = 5.12;
        d = f; // float-->double,数据范围由小到大,隐式转换
        f = (float)d; // double-->float, 数据范围由大到小,需要强转,否则编译失败
        a = d; // 报错,类型不兼容
        a = (int)d; // int没有double表示的数据范围大,需要强转,小数点之后全部丢弃
        byte b1 = 100; // 100默认为int,没有超过byte范围,隐式转换
        byte b2 = (byte)257; // 257默认为int,超过byte范围,需要显示转换,否则报错
        boolean flag = true;
        a = flag; // 编译失败:类型不兼容
        flag = a; // 编译失败:类型不兼容

    }

注意事项: 

1. 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型

2. 如果需要把范围大的类型赋值给范围小的, 需要强制类型转换, 但是可能精度丢失

例如:

public class Test {
    public static void main(String[] args) {
        int a;
        float i;
        double b=3.14;
        a=(int)b;
        i=(float)b;
        System.out.println(a);
        System.out.println(b);




    }

但是如果将a+b;赋给一个short类型就会报错。因为会自动将a+b提升

3. 将一个字面值常量进行赋值的时候, Java 会自动针对数字范围进行检查

如图: 

这里我们的byte类型的最大值为127,当我们字面赋值为128时,这里就直接标红告诉我们错误了,这就是java相比于C的严谨性。 

4. 强制类型转换不一定能成功,不相干的类型不能互相转换

 如下:boolean类型是不能参与强制转换类型的


 



三、类型提升

3.1  在进行某些运算时,不同类型的数据会被提升到共同的类型。例如,在进行算术运算时, byte 和 short 类型会被提升到 int 类型。
 

 

如上面,short与byte类型直接就可以自动提升为int类型了,所以编译器是无法进行自动转换类型进行正常赋值的。


 四、 字符串类型

4.1 字符串转换为整形

再Java中字符串也是可以强制转换为整形的。

如下:

String str = "100";
int num = Integer.parseInt(str);

这时num的值就是100.


4.2整形转换为字符串

int num = 10;
// 方法1
String str1 = num + ""; 
// 方法2
String str2 = String.valueOf(num);


文章到末尾,喜欢的话,点个赞吧。