Java数据类型的转换和类型提升(07)

一:类型转换

Java 作为一个强类型编程语言, 当不同类型之间的变量相互赋值的时候, 会有教严格的校验,当参与运算数据类型不一致时,就会进行类型转换。Java中类型转换主要分为两类:自动类型转换(隐式)强制类型转换(显式)
比如:

public static void main(String[] args) {
        int little=10;
        long big=1L;
        little=big;//little装不下big,IDEA会提示出错
    }

little是int型,有4个字节,而big是long类型,有8个字节。要把big赋值给little显然是装不下的(不看初始值大小,只关注数据类型本身大小),会造成数据丢失的后果。
此时如果非要让他们相等(因为我们是知道big的初始值是不大于int类型的范围,所以不担心丢失数据),就需要用到强制类型转换

public static void main(String[] args) {
        int little=10;
        long big=1L;
        little=(int) big;//强制使big变成int类型,这样就塞得下了
    }

当然,强制类型转换不一定安全,如果big的值超过int类型的范围,就会发生错误,此时是否要强制转换就要看我们本身的需求了。
注:

  1. 如果要把float类型赋值给int类型,也需要强制转换,虽然他俩都是4个字节,但因为float可以表示小数,它所表示的数据精度就更高。也可以认为浮点型范围大于整型。
  2. 强制类型转换不一定能成功,不相干的类型不能互相转换。比如boolean和int就不能转换。

在这里插入图片描述
自动类型转换(隐式):代码不需要经过任何处理,在代码编译时,编译器会自动进行处理。特点:数据范围小的转为数据范围大的时会自动进行。
即,上面如果把little赋值给big,编译器就不会报错,而是自动将little提升为long类型,然后赋值。

二:类型提升

在不同类型的数据之间相互运算时,数据类型小的会被提升到数据类型大的。
比如:

public static void main(String[] args) {
        int a = 10;
        long b = 20;
        int c = a + b; // 编译出错
        //改正方法:
        int c=(int) (a+b);// 编译成功
        long d = a + b; // 编译成功
    }

其中,a+b 的时候,是 int 类型+ long 类型,系统会自动提升为 long+long ,而 c 是 int 类型,放不下 long 类型所以会出错。
又比如:

public static void main(String[] args) {
        byte a = 10;
        byte b = 20;
        byte c = a + b;//编译出错
        //改正方法:
        byte c = (byte)(a + b);
    }

此处 byte 和 byte 都是相同类型, 但是计算 a + b 系统还是会先将 a 和 b 都提升成 int, 再进行计算, 得到的结果也是 int, 这是赋给 c, 就会出现上述错误。
这是由于计算机的 CPU 通常是按照 4 个字节为单位从内存中读写数据.,为了硬件上实现方便,诸如 byte 和 short 这种低于 4 个字节的类型,会先提升成 int, 再参与计算。

2.1:String类型的特殊规则

在Java中任意类型+字符串都会被转换为字符串类型,比如:

public static void main(String[] args) {
        int a=10;
        int b=333;
        System.out.println("a="+a);
        System.out.println("b="+b);
    }

运行结果为:
在这里插入图片描述
那么再看下面的情况,思考一下(注:Java代码都是从左往右运行的),让我们加深一下理解:

public static void main(String[] args) {
        int a=10;
        int b=333;
        System.out.println("a+b="+a+b);//这里应该输出什么?
    }

运行结果为:
在这里插入图片描述
我们可以再考虑一下,如果是下面两种情况,输出结果会是什么呢?结果我会打在评论区,看看对不对。

		System.out.println("a+b="+(a+b));
        System.out.println(a+b+"是a+b的值");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值