Java基础之隐式转换vs强制转换

 更新时间:2015年12月28日 14:34:53   投稿:mrr  
这篇文章主要介绍了Java基础之隐式转换vs强制转换的相关资料,需要的朋友可以参考下

Java中,经常可以遇到类型转换的场景,从变量的定义到复制、数值变量的计算到方法的参数传递、基类与派生类间的造型等,随处可见类型转换的身影。Java中的类型转换在Java编码中具有重要的作用。

在定义变量时,有许多要注意的问题,一不小心就会出现损失精度或者不兼容类型等问题。

例如:

    1.定义长整型数据时,必须加后缀l或L

              long l =123456789012345L

    2.定义单精度类型时(7-8位有效数字),必须加后缀 f 或 F

              float f = 12.5F

          3. boolean类型不可以转换为其它的数据类型。

这其中,我们常常会遇到数据类型的转换问题,最为常见的要属隐式转换和强制转换了,我们来分析一下。

隐式转换

特征:

从小到大,可以隐式转换,数据类型将自动提升。

byte,short,char -->int  -->long -->float -->double

注意:long是8个字节,float是4个字节。

long是整数,float是浮点型,整数和浮点数的存储规则不一样,记住一点long的范围是小于float的。

例 :

byte a=10;
int b=a;

当编译intb=a 时,  a隐式转换为int类型。

强制转换

特征:

     从大到小(如果你明确知道数据是可以用该数据类型来表示的,可以用强制转换)

格式:

    (转换后的数据类型)变量或者值。

注:一般情况下,根本不推荐使用强制类型转换。

           例1 :

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

当编译 byte b=(byte)a时, a被强制转换为byte类型。

例2:

class QiangZhiDemo 
{ 
  public static void main(String[] args) 
  { 
    byte b=(byte)130; 
    System.out.println(b); //打印结果-126 
  }   
} 

解析:

数据130默认的是int类型的十进制数据,

第一步:十进制130转换成二进制数据。

  10000010

第二步:130在内存中的表示形式如下

原码:0000000000000000 00000000 10000010

第三步:求int130的补码

因为130是正数,所以,反码和补码都和原码一致。

补码:0000000000000000 00000000 10000010

第四步:对补码进行截取,只剩下最后8位。

(byte)130 的补码为:10000010

第五步:把该补码转化为原码。

由于符号位(第一位)是1,故该数为负数,

反码:10000001     (补码-1)

原码:11111110     (符号位不变,数据位取反)

转化为十进制为 -126,所以最终打印-126。

     例3 :

shorts = 1;
s= s +1;   

shorts = 1;
s+=1;   

有问题吗?为什么呢?

     解析:

第一程序会报错:错误:不兼容的类型:从int转换到short可能会有损失     

原因:s=s+1;s+1会隐式转换为int类型,当把一个int类型赋值给short类型是,可能会损失。

第二个程序可以编译运行。    

原因:s+=1,虽然可以看做s=s+1,但是还是有区别的,s+=1中有一个强制转换,即s=(short)(s+1),会把s+1的值强制转换为short类型,故不会报错。

小结:

数据类型转换的问题如果发生在一些小程序上,我们或许能够一眼看出,可是当编写一个庞大的系统时,拥有庞大数据量时,这些小小的问题可能导致系统出错甚至崩溃,所以前期代码编写的严谨性就得靠我们自己把握了。

以上内容给大家介绍了Java基础之隐式转换vs强制转换,希望大家喜欢。

相关文章

  • Java 基础详解(泛型、集合、IO、反射)

    Java 基础详解(泛型、集合、IO、反射)

    下面小编就为大家带来一篇Java 基础详解(泛型、集合、IO、反射)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • Java 如何用二维数组创建空心菱形

    Java 如何用二维数组创建空心菱形

    这篇文章主要介绍了Java 如何用二维数组创建空心菱形,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Mybatis一对多与多对一查询处理详解

    Mybatis一对多与多对一查询处理详解

    这篇文章主要给大家介绍了关于Mybatis一对多与多对一查询处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Kafka中的producer拦截器与consumer拦截器详解

    Kafka中的producer拦截器与consumer拦截器详解

    这篇文章主要介绍了Kafka中的producer拦截器与consumer拦截器详解,Producer 的Interceptor使得用户在消息发送前以及Producer回调逻辑前有机会对消息做 一些定制化需求,比如修改消息等,需要的朋友可以参考下
    2023-12-12
  • Spring FTP上传下载工具类遇到问题小结

    Spring FTP上传下载工具类遇到问题小结

    本文通过实例代码给大家介绍了Spring FTP上传下载工具类遇到问题小结,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2017-12-12
  • Java设计模式之适配器模式详解

    Java设计模式之适配器模式详解

    这篇文章主要介绍了Java设计模式之适配器模式详解,适配器模式将一个类的接口转换成客户希望的另一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作的哪些类可以一起工作,需要的朋友可以参考下
    2023-09-09
  • Java 在Word文档中添加艺术字的示例

    Java 在Word文档中添加艺术字的示例

    这篇文章主要介绍了Java 在Word文档中添加艺术字的示例,帮助大家使用Java处理word文档,感兴趣的朋友可以了解下
    2020-09-09
  • Java中RedisUtils工具类的使用

    Java中RedisUtils工具类的使用

    本文主要介绍了Java中RedisUtils工具类的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 如何使用Spring Boot ApplicationRunner解析命令行中的参数

    如何使用Spring Boot ApplicationRunner解析命令行中的参数

    这篇文章主要介绍了使用Spring Boot ApplicationRunner解析命令行中的参数,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-12-12
  • 深入理解java中i++和++i的区别

    深入理解java中i++和++i的区别

    下面小编就为大家带来一篇深入理解java中i++和++i的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论