黑马程序员技术交流社区

标题: 基本数据类型小问题 [打印本页]

作者: 李菁    时间: 2012-9-12 22:35
标题: 基本数据类型小问题
short i=5;整数默认类型应该是int啊。为什么这个不需要强转?为什么不报错
i+=5;
i=i+5;这么写和上面的那个实现的是一样的为什么上面的没有问题。这么写就报错啊?

作者: 小黑马    时间: 2012-9-12 22:47
简单数据类型之间的转换
简单类型数据间的转换,有两种方式:自动转换和强制转换,通常发生在表达式中或方法的参数传递时。
⑴自动转换
具体地讲,当一个较“小”数据与一个较“大”的数据一起运算时, ,再进系统将自动将“小”数据转换成“大”数据行运算。而在方法调用时,实际参数较“小”,而被调用的方法的形式参数数据又较“大”时(若有匹配的,当然会直接调用匹配的方法),系统也将自动将“小”数据转换成“大”数据,再进行方法的调用,自然,对于多个同名的重载方法,会转换成最“接近”的“大”数据并进行调用。
这些类型由“小”到“大”分别为 (byte,short,char)--int--long--float—double。这里我们所说的“大”与“小”,并不是指占用字节的多少,而是指表示值的范围的大小。
请看下面的示例:

①下面的语句可以在Java中直接通过:
byte b;
int i=b;
long l=b;
float f=b;
double d=b;
而byte,short.char是平级关系,是可以相互转换的.

作者: Tesla时光    时间: 2012-9-12 22:52
这个问题是一个比较经典的问题,
i+=5会先转换成int型完成运算后,java会对i进行窄化转换,由编译程序自动执行.自动进行强转回short
而i=i+5,在转换成int型运算后,不会自动强转回short
作者: 张忠豹    时间: 2012-9-12 22:58
首先short i=5;这个是java中变量的声明,5在short类型的范围内,所以不会报错。

至于i+=5,由于 += 是java语言规定的运算符,java编译器会对它进行特殊处理,因此可以正确编译。
而i=i+5,由于i+1运算时会自动提升表达式的类型,所以结果是int型,再赋值给short类型i时,编译器将报告需要强制转换类型的错误。
作者: 杨千里    时间: 2012-9-12 23:30
本帖最后由 杨千里 于 2012-9-12 23:34 编辑

short i=5;整数默认类型应该是int啊。为什么这个不需要强转?为什么不报错          //java中数据的定义变方式:数据类型  变量名称。java中整数默认(默认就是你没有声明它是什么类型,jvm给它进行初始化声明,一旦你声明它是什么类型,它就是什么类型,想换成起类型,就必须强转)
i+=5;
i=i+5;这么写和上面的那个实现的是一样的为什么上面的没有问题。这么写就报错啊?//上面的 i+=5;+=被jvm识别为一次运算,自动提升为int类型, i=i+5是两次运算来实现的,运算结果为int类型,在赋给short类型,所以会报错

作者: 李菁    时间: 2012-9-13 00:43
问题已解决。
明白了,谢谢大家了
作者: 武庆东    时间: 2012-9-13 02:08
java类型转换非两种:
一、自动类型转换,即隐式转换,有系统自动完成。
    转换规则:从存储范围小的类型到存储范围大的类型。
    具体规则:byte-->short(char)--->int--->long--->float--->double
二、强制类型转换,由于存储方式不同,可能损失精度。
    转换规则:从存储范围大的类型存储到范围小的类型
    具体规则;double→float→long→int→short(char)→byte




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2