学员试听 >
机构入驻 >
试听课程申请
看不清,请点击刷新
立即申请
机构入驻申请
看不清,请点击刷新
立即申请
试听课程申请
看不清,请点击刷新
立即申请
机构入驻申请
看不清,请点击刷新
立即申请
课程分类
寻客吧 > 教育新闻 > 电脑培训 >  基本类型之间的转换

基本类型之间的转换

时间:2025-06-10 14:13:23  编辑:保定达内  来源:寻客吧  浏览:205次   【】【】【

  基本类型之间的转换
  将一种类型的值赋值给另一种类型是很常见的。在Java中,boolean类型与其他7中类型的数据都不能进行转换,这一点很明确。但对于其他7种数据类型,它们之间都可以进行转换,只是可能会存在精度损失或其他一些变化。
  转换分为自动转换和强制转换:
  自动转换(隐式):无需任何操作。
  强制转换(显式):需使用转换操作符(type)。
  将6种数据类型按下面顺序排列一下:
  double>float>long>int>short>byte
  如果从小转换到大,那么可以直接转换,而从大到小,或char和其他6种数据类型转换,则必须使用强制转换。
  1、自动转换
  自动转换时发生扩宽(widening conversion)。因为较大的类型(如int)要保存较小的类型(如byte),内存总是足够的,不需要强制转换。如果将字面值保存到byte、short、char、long的时候,也会自动进行类型转换。注意区别,此时从int(没有带L的整型字面值为int)到byte/short/char也是自动完成的,虽然它们都比int小。在自动类型转化中,除了以下几种情况可能会导致精度损失以外,其他的转换都不能出现精度损失。
  》int-->float
  》long-->float
  》long-->double
  》float-->double without strictfp
  除了可能的精度损失外,自动转换不会出现任何运行时(run-time)异常。
  2、强制类型转换
  如果要把大的转成小的,或者在short与char之间进行转换,就必须强制转换,也被称作缩小转换(narrowing conversion),因为必须显式地使数值更小以适应目标类型。强制转换采用转换操作符()。严格地说,将byte转为char不属于narrowing conversion),因为从byte到char的过程其实是byte-->int-->char,所以widening和narrowing都有。强制转换除了可能的精度损失外,还可能使模(overall magnitude)发生变化。强制转换格式如下:
  (target-type)value;
  如果整数的值超出了byte所能表示的范围,结果将对byte类型的范围取余数。例如a=256超出了byte的[-128,127]的范围,所以将257除以byte的范围(256)取余数得到b=1;需要注意的是,当a=200时,此时除了256取余数应该为-56,而不是200。
  将浮点类型赋给整数类型的时候,会发生截尾(truncation)。也就是把小数的部分去掉,只留下整数部分。此时如果整数超出目标类型范围,一样将对目标类型的范围取余数。
  7种基本类型转换总结如下图:
  3、赋值及表达式中的类型转换
  3.1、字面值赋值
  在使用字面值对整数赋值的过程中,可以将int literal赋值给byte short char int,只要不超出范围。这个过程中的类型转换时自动完成的,但是如果你试图将long literal赋给byte,即使没有超出范围,也必须进行强制类型转换。例如byte b=10L;是错的,要进行强制转换。
  3.2、表达式中的自动类型提升
  除了赋值以外,表达式计算过程中也可能发生一些类型转换。在表达式中,类型提升规则如下:
  ·所有byte/short/char都被提升为int。
  ·如果有一个操作数为long,整个表达式提升为long。float和double情况也一样。
  拓展知识点:Java是面向对象语言,其概念为一切皆为对象,但基本数据类型算是个例外哦,基本数据类型大多是面向机器底层的类型,它是“值”而不是一个对象,它存放于“栈”中而不是存放于“堆”中,但Java一切皆为对象的概念不是说说而已,它为每一个基本数据类型都做了相应的包装类,我们日常使用中大多情况下都会使用着这些包装类:
  boolean Boolean
  char Character
  byte Byte
  short Short
  int Integer
  long Long
  float Float
  double Double
  String(字符串)
  包装类就是一个对象,它存放于“堆”中。