提高你的Java代码质量吧:不要让类型默默转换

一、分析

在Java运算中的类型转换,是先运算在进行类型转换的具体场景如下

二、场景

在如下程序中

public class Client{ 
    public static final int LIGHT_SPEED = 30 * 10000 * 1000; 
    public static void main(String[] args){ 
        System.out.println("月亮照射到地球需要1秒,计算月亮到地球的距离。"); 
        long dis1 = LIGHT_SPEED * 1; 
        System.out.println("月亮与地球的距离是:" + dis1 + "米"); 
        System.out.println("----------------------------------------------------"); 
        System.out.println("太阳照射到地球上需要8分钟,计算太阳到地球的距离。"); 
        //可能超出整数范围,使用long型 
        long dis2 = LIGHT_SPEED * 60 * 8; 
        System.out.println("太阳与地球的距离是:" + dis2 + "米"); 
    } 
} 

运行结果是

月亮照射到地球需要1秒,计算月亮到地球的距离。

月亮与地球的距离是:300000000米

----------------------------------------------------

太阳照射到地球上需要8分钟,计算太阳到地球的距离

太阳与地球的距离是:-2028888064米


太阳和地球的距离竟然是负的!那是因为Java是运算然后再进行类型的转换,具体地说是因为dis2的三个运算参数都是int类型,三者相乘的结果虽然也是int类型,但是已经超过了int的最大值,所以其值就是负值了,在转换成long型,结果是负值。


解决办法,只要加个L即可,如下

long dis2 = LIGHT_SPEED * 60 L * 8;

60L是long型,乘出来的结果也是long型,在还没有超过int类型的范围时就已经转换成long型了。

三、建议

在实际开发中,基本类型的转换时,通用的做法是主动声明式类型转换(注意不是强制类型转换)。代码如下

long dis2 = 1L * LIGHT_SPEED * 60 * 8;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值