【Java】隐式转换 和 强制转换

一、引入

关于算术运算符的基本用法我们已经学习完了,现在来学习关于运算符的高级用法。

下面以加法为例,它一共会有三种情况:数字相加、字符串相加、字符相加。

案例一:下面 int类型adouble类型b 相加结果赋值给变量c变量c是什么类型?

以前我们在计算的时候都是同一种数据类型进行计算的,而在现在的代码中,相加的数据类型不一样了。

你现在肯定是这么想的:10 + 12.3 = 22.3,而22.3是一个小数,小数默认类型是double,所以你会猜c的类型一定是double。这个答案是正确的。

public class Test {
    public static void main(String[] args) {
        int a = 10;
        double b = 12.3;
        c = a + b;
    }
}

案例二:下面 int类型adouble类型b 相加,此时相加的结果的类型应该为int还是double呢?

public class Test {
    public static void main(String[] args) {
        int a = 10;
        double b = 20.0;
        c = a + b;
    }
}

image-20240330135238692

在相加的过程中,首先我们要知道一个规则:数字进行运算的时候,数据类型不一样不能直接参与运算,需要转成一样的,才能运算。

转换方式一:隐式转换 —— 将取值范围小的,变成取值范围大的

转换方式二:强制转换 —— 将取值范围大的,转换为取值范围小的

image-20240330135304870


二、隐式转换

隐式转换也叫 自动类型提升。就是把一个取值范围小的数据或者变量,赋值给另一个取值范围大的变量。此时不需要我们额外写代码单独实现,是程序自动帮我们完成的。

最重要的是,隐式转换是不需要我们单独写代码的,是程序自动帮我们完成的。

比如说:在以前,下面代码 double b = a; 写的肯定是有问题的,因为类型不一样,是不能赋值的。但是我们现在学习了隐式转换,此时第二行代码就可以解释的通了。

int a = 10;
double b = a;

先来看看取值范围:在这个取值范围中,最小的是byte,最大的是double。所以变量a赋值给变量b的时候,就是取值范围小的,赋值给取值范围大的。此时变量a记录的10,会自动提升为10.0,注意:是变量里面记录的值会提升为10.0,这个提升是不需要我们自己额外写代码实现的,是程序自动帮我们完成的。此时变量b记录的值就是10.0,小的自动的变成了大的。那它的底层原理是什么呢?这个在第二阶段会讲解,但是因为我们现在是刚开始入门,我们暂时只需要知道这个结果就可以了。

image-20240330135811768

正是因为有了隐式转换,不同的数据类型才能够在一起进行计算。不同的数据类型在计算的时候会有两种提升规则。

  • 取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算
  • byte、short、char这三种类型的数据在运算的时候,都会直接先提升为int,然后再进行运算

例一:在下面代码当中,a是int类型(整数),b是double类型(小数)。由于这两种类型的不一样,就不能直接运算,需要转成一样的才能运算。根据取值范围的大小关系:double > int,所以是变量a里面的数据会自动变成double里面的,然后再进行运算。所以 a + b 在进行运算的时候实际上是两个double在进行运算,所以的最后结果c,也就是double类型的。

public class Test {
    public static void main(String[] args) {
        int a = 10;
        double b = 20.0;
        c = a + b; // 结果是?
    }
}

例二:a 和 b都是byte类型的,问 a + b 得到的结果c,是什么类型的?

根据第二个提升规则,byte类型的数据在运算的时候,都会先提升为int类型,然后再进行运算。

下面代码中,等号两边在相加的时候都会先自动提升为int类型,在提升之后,实际上就是两个int相加,因此,最终的c都是int类型的了。

public class Test {
    public static void main(String[] args) {
        byte a = 10;
        byte b = 20;
        c = a + b; // 结果是?
    }
}

总结

  • 取值范围:byte < short < int < long < float < double

  • 什么时候进行转换?

    数据类型不一样,不能进行计算,需要转成一样的才可以进行计算。

  • 转换规则1:

    取值范围小的,和取值范围大的进行运算,小的会先提升为大的,再进行运算

  • 转换规则2:

    byte、short、char这三种类型的数据在参与计算的时候,都会直接先提升为int,然后再进行运算


三、隐式转换练习:请问最终的运算结果是什么类型的?

例一:加法运算时从左到右依次计算。所以它是先计算 i + n,i + n是int 加上long,两个类型不一样,很明显要转换,由于long 大于 int,所以i里面的值会自动提神为long类型。前面两个数在参与计算的时候就相当是两个long进行计算。

然后就是一个long类型加上一个double类型,两个类型又不一样,所以还要再转换,由于double 大于 long,所以long类型的数据会自动提升为double类型,所以最终结果就是double类型。

int i = 10;
long n = 100L;
double d = 20.0;
数据类型 result = i + n + d;

例二:首先是 b + s,由于b是byte类型的,s是short类型的,根据刚刚讲的第二个规则,byte、short在参与计算的时候,统一先提升为int,然后再参与运算,所以 b + s 就相当于是两个int相加,最终的结果是int。

然后int 再去和 long类型的 n 相加,int最终提升为long。所以最终的result为long类型。

byte b = 10;
short s = 20;
long n = 100L;
数据类型 result = b + s + n;

四、强制转换

在代码当中,如果要把一个取值范围大的数值,赋值给取值范围小的变量。是不允许直接赋值的。如果一定要这么做就需要加入强制转换。强制转换是需要我们自己手动编写代码的,它的格式是:目标数据类型 变量名 = (目标数据类型)被强转的数据 ,简单理解就是,你想要转成什么类型,就在小括号中写什么类型就行了。

例如:将下面变量a里的数据直接赋值给变量b,肯定是不行的,因为等号后面变量a,取值范围是比较大的,而现在是把一个大的,给小的,是不能直接给的。但如果你一定要这么办,就需要先将a转为int类型。

double a = 12.3;
int b = (int)a;

PS:强制转换有可能导致数据发生错误。(数据的精度丢失)

例如:int 类型的 a中存放的数据比较大,超出了byte的范围,此时数据就会发生错误。

int a = 300;
byte b = (byte) a;

五、强制转换练习

如果将等号左边的result的int类型改为byte类型,那等号右边应该如何变?

byte b1 = 10;
byte b2 = 20;
// int result = b1 + b2;
byte result = b1 + b2;

代码示例

package com.itheima.arithmeticoperator;

public class ArithmeticoperatorDemo3 {
    public static void main(String[] args) {
        byte b1 = 10;
        byte b2 = 20;
        //现在我们要强转的是谁?
        //b1 + b2计算之后的结果。
        // (byte)b1 + b2 强转的是b1,并不是最终的结果
        byte result = (byte)(b1 + b2);
        System.out.println(result);//30
    }
}

但如果转换的数据过大,就会发生错误

package com.itheima.arithmeticoperator;

public class ArithmeticoperatorDemo3 {
    public static void main(String[] args) {
        byte b1 = 100;
        byte b2 = 200;
        byte result = (byte)(b1 + b2);
        System.out.println(result);//-56,结果就发生错误了。因为要转换的数据过大
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值