🌀🌀🌀作者:@小鱼不会骑车 🍁🍁🍁专栏: 《java练级之旅》 🎀🎀🎀个人简介:一名专科大一在读的小比特,努力学习编程是我唯一的出路😎😎😎 在这里插入图片描述

作者心里话

小鱼一直都是秉承着“开开心心看博客,快快乐乐学知识”这个观点来给大家用一些接地气的话进行讲解,可能会有人觉得小鱼太墨迹了,小鱼这里也很乐意接受大家的意见,会进行采纳,大家也可以指出小鱼的不足,小鱼也会积极的进行改变,总之,愿我们越来越优秀

前言

接上篇内容,今天讲解的是关于在java中的类型转换内容,文章总体字数不多,但是是小鱼精心制作的,对新手很友好,大家感兴趣可以继续往下看。

(练级第二天)

介绍类型转换

java作为一个强类型编程语言,当不同类型之间的变量相互赋值的时候会进行严格的校验

任务1:我们为什么要进行类型转换 任务2:什么是显性类型转换 任务3:什么是隐性类型转换 任务4:总结两者之间的区别

1.为什么要进行类型转换

前提提到了,我们的java是一个强类型的编程语言,对代码会进行一个比较严谨的检查

我给大家看两幅图片的对比 C语言 在这里插入图片描述 java语言 在这里插入图片描述 大家可以很清晰的看到两者之间的区别,在C语言中我们的长整型赋值给整形是不会报错的,但是!在我们的java中却会出现问题。这就体现了java的安全性, 在这里插入图片描述

这个就是java中报的错误,可能会数据丢失,但是在C语言中,可不管你这些,你数据丢失就丢失,到时候自己调试找错误去吧,是不是很可气啊,但是大家可能还会有疑问,这个问题该怎么解决呢,接下来进入正题。

2.什么是显性类型转换

强制类型转换(显性)

2.1 byte类型转换

其实这个应该是放到后面讲的,但是咱们按照字节的顺序,那么就从这个只有一个字节的byte开始吧,(C语言中不存在byte我就暂时先不进行对比) 看图 在这里插入图片描述

在这里插入图片描述

问题 1: 为什么int类型的值不能赋值给byte类型的值 问题 2: 为什么byte类型的值不能接收int类型和byte类型相加的值 问题 3:为什么我的byte类型的值不能接收byte类型的值相加

2.1.1 问题一

好的我们来讲第一个问题先:其实第一个问题在前言也涉及到了,是因为可能会造成数据的丢失,由于是高类型像低类型转换,解决方法有两种

  a=(byte)d;//方法一
  b=a;//方法二

方法一 涉及到的一个问题就是我们所常知的强制类型转换,和C语言的强制类型转换是一个写法 在这里插入图片描述 如图,经过强转之后我们的a的值就是字符c应的ascll值,这里就不再过多讲解, 在进行强制类型转换后,虽然编译器不会报错,但是!可能就会造成数据的丢失啊,以及一些其他的隐患, 方法二 方法二就不需要担心了,我们的byte类型是一个字节,我们的int类型是4个字节我把一个1个字节的值赋值给一个4个字节的变量,编译器自然不会报错,当然这里涉及到了隐性类型转换(类型提升)下面会讲到,

2.1.2 问题二

问题2,为什么我们的byte类型不能接收一个整形和一个byte类型相加的值,其实就和上面的相似,由于我们的int是4个字节,可能会造成数据丢失,于是编译器也就自然的不给通过了,解决方法 在这里插入图片描述 方法一 这个时候大家可能就会疑惑?不对啊,我的d已经强转成byte类型了,为什么编译器还不通过,编译器出错了?这其实以前也是小鱼的疑问,我都是同一类型,为什么还报错,但是我们要记住一点,编译器是不会出错的,错的只可能是自己写的代码,那么我给大家简单解释一下: 在我们的编译器中,数值的运算一般都是按照四个字节进行的,比如我们是一个byte类型的值,如果想进行运算,那就需要被提升为4个字节进行运算,这就导致我们最后输出的数值是4个字节的类型,可是我们的一个byte类型只有一个字节啊,怎么能存下这4个字节类型的值,于是编译器就会给我们报错,错误的原因就是在这里插入图片描述

那我们该如何解决呢?其实可以这样 在这里插入图片描述 嘿!大家看这不就成了嘛,我们将提升为4个字节的类型再次经过强制类型转化,转化为1个字节的大小,这不就搜易贼嘛!但是大家注意,其实只要是涉及到强转都会可能存在内存丢失的风险,所以大家要时刻记住这句话, 强转可能会造成数据丢失!!! 强转可能会造成数据丢失!!! 强转可能会造成数据丢失!!! 好的,咱们重要的事情说三遍,大家可千万不要再犯这种错误呦😷😷😷(像面对疫情一样要时刻提防) 方法二 这个大家都了解了吧,我把一个经过运算后的值(4个字节),赋值给一个4个字节大小的int类型不会出错的,所以小鱼是推荐这种方法的,但是各个方法有各个方法的用途,存在即合理,如果以后涉及到必须强制类型转化的问题,小鱼也会单独给大家讲解

3.什么是隐性类型转换

权威说法

隐性(自动)类型转换即:代码不需要经过任何处理,在代码编译时编译器会自动进行处理。 特点:数据范围小的数转换为数据范围大的数会自动进行。

介绍

我们的隐性类型转换跟我们的C语言中的类型提升其实是一个概念,一个小的类型去与一个大的类型相加,那么我们输出的值的类型,也就是根据大的那个类型来判断,例如我们之前做过的一道题

在这里插入图片描述 相信大家都见过这道题吧,这是C语言讲到的一道经典题,当然最后的答案大家也一定清楚,是long long类型,就像之前说的我们的不同类型的变量在相加时,都会被系统进行潜移默化的类型提升,例如

        byte a=10;
        byte b=20;
        int c=a+b;

最后我们输出的值的类型就是int类型,当然如果是这样的话,

        byte a=10;
        byte b=20;
        long c=a+b;

那我们的输出的类型就是long类型,虽然我们在运算的时候时四个字节进行运算,但是我们最后赋值给long类型的时候就已经被编译器把类型进行提升了, 这样的例子还有

  		float a=3.14f;
        float b=66.6f;//尾上加入f或F具题看《练级第一天》这个博客
        double c=a+b;//我们的float进行了类型提升

就这样,我们的float类型的值就被提升为double类型的值了,

4.总结两者之间的区别

好的,接下来到了总结的时间,

4.1 显性类型提升

强制类型转换显示

强制类型转换:当进行类型转换操作时,代码需要经过一定的格式处理,不能自动完成,特点(数据范围大的数转换为数据范围小的数的时候使用)

  public static void main(String[] args) {
        int a=10;
        long b=100L;
        b=a;//int类型转换为long类型,数据范围由小到大,
        a=(int)b;//long类型转换为int类型,数据范围由大到小,需要强转否则编译失败

        float c=3.14f;
        double d=6.66;
        d=c;//float类型转换为double类型,数据范围由小到大,
        c=(float)d;//double类型转换为float类型,数据范围由大到小,需要强转否则编译失败

        a=d;//报错,类型不兼容,需要强转
        a=(int)d;//int没有double表示的范围大,需要强转,小数点后面的值全部丢弃
        b=a;//int类型转化为double类型,数据范围由小变大

        byte b1=100;//100默认为100,没有超过byte范围(隐式转换)
        byte b2=(byte)257;//257默认为int,超过byte范围,需要显式转换否则报错

        boolean flag=true;
        a=flag;//编译失败类型不兼容
        flag=a;//编译失败类型不兼容
    }

4.2 隐性类型提升

再看一遍这个代码

byte a=10;
byte b=20;
byte c=a+b;

结论

byte和byte都是相同的类型,但是出现编译报错原因是,虽然a和b都是byte,但是计算a+b会将a和b都提升为int再进行计算,得到的结果也是int,这时赋值给c就会出现下图错误

在这里插入图片描述

由于计算机CPU通常是按照4个字节为单位从内存中读取数据,为了硬件上实现方便,诸如short和byte这种低于四个字节的类型,会先提升成int,再进行计算

正确写法

byte a=10;
byte b=20;
byte c=(byte)(a+b);

类型提升小结💯💯💯

  1. 不同类型的混合运算,范围小的会提升成范围大的
  2. 对应short,byte这种比四个字节小的类型,会先提升成四个字节的int再进行计算

还有一个小问题就是, 数字不是也默认为int类型赋值给byte嘛,怎么不会报错 答案:编译器会帮你检查,如果你输入的值是在自己范围内就不会报错,如图 在这里插入图片描述 关于为什么128就会报错是因为128已经超过了byte的可容纳的值的最大范围,具体范围请看《java练级第一天》