zoukankan      html  css  js  c++  java
  • 提高你的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; 

  • 相关阅读:
    Centos-706停用firewalld启用Iptables服务
    apache访问日志分析[转]
    apache日志管理【转】
    [转]如何使用PHP实现javascript的escape和unescape函数
    [转]linux下centos服务器安全设置
    [转]sysctl -P 报错解决办法
    [转]解决error: "net.ipv4.netfilter.ip_conntrack_max" is an unknown key错误
    [转]CentOS Apache 性能调试!
    [转]怎么查看和修改 MySQL 的最大连接数?
    [转]同一台Windows机器中启动多个Memcached服务
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3196618.html
Copyright © 2011-2022 走看看