A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Heart 中级黑马   /  2013-6-16 10:35  /  1571 人查看  /  10 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

short s1 = 1; s1 = s1 + 1;在编译时会有错误,我知道是类型提升的问题
但为什么 short s1 = 1; s1 += 1;在编译时没有错误呢?s1 += 1 不就相当于 s1 = s1 + 1 吗?

评分

参与人数 1技术分 +1 收起 理由
Super_Class + 1

查看全部评分

10 个回复

倒序浏览
楼主,借你这个问题,我把我的总结分享给大家:
在类型转换这里,
从数据类型来看有两种类型转换,一种是基本数据类型之间的类型转换;二是引用类型之间的类型转换
从转换时是否显示指定来看,有强制类型转换和自动类型转换
这里就直说基本数据类型之间哪些可以转换吧,我总结之后认为,基本类型之间的数据转换遵循两个原则,一是同语义原则,二是同存储方式原则。
语义相同的数据类型之间可以转换,主要是指数值类型之间可以转换,存储方式相同的数据类型之间可以转换,主要是 char 和 整型之间可以转换。
类型转换的时候,涉及到数据范围问题的,如果 java 编译器能判断没有越界的不会报错,否则会报错。
举个栗子,
short s = 1; 这个表达式里面 1 是默认的整型,那么就是 int 类型了,s 是 short 类型,这样的话,相当于默认给1变为(short)1,这种默认的行为,java 编译器是会检查数据类型转换是否可行的,因为是默认,容易犯错误,而不像显示的强制类型转换,开发者是有意识的使用类型转换,此时 java 编译器对类型转换的要求就没有那么严格。隐式转换的时候,在 java 编译器检查类型类型转换遵循“ java 编译器能判断没有越界的不会报错,否则会报错。”。因为 1 是常数,java 编译器自然可以判定有没有越界。而 short s = s + 1; s + 1 是个变量表达式,必须在程序执行的时候,才知道表达式的值,此时 java 编译器就会报错。short s += 1;这个是个特殊的情况,在这里毕老师有一句话解释了,说凡是复合赋值运算符都是带有强制类型转换的,也就是显示的强制类型转换,那么 java 编译器就不会报错了,因为你一旦使用复合运算符,java 编译器认为你是有意识的使用类型转换,为什么java编译器这样设定,我觉得可能是复合赋值运算符本来就是给高手准备的一种简易表达形式,java 编译器把使用者设为高手,自然要限制少一点。
对于这个只能说,复合赋值运算符是带显示强制类型转换的,这个只能记住,希望我上面的分析能帮助您理解和记忆。说得不对的地方,欢迎大家积极拍砖。{:soso_e144:}

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 赞一个!

查看全部评分

回复 使用道具 举报 2 0
有自动转型
short s1 = 1;
s1 += 1;

相当于:s1 = (short)(s1+1);

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 赞一个!

查看全部评分

回复 使用道具 举报
short s1 = 1; s1 = s1 + 1; 这个代码在给s1+1运算和s1的赋值,一共是两次运算,根据类型提升,将s1+1运算后的结果是int型,所以第二次的赋值运算由于类型不同,不能直接赋值。需要手动强转。

而+=这是一个运算符,也就是说s1+=1,只进行了一次运算操作,所以编译和运行都会通过。

评分

参与人数 1技术分 +1 收起 理由
孙百鑫 + 1 很给力!

查看全部评分

回复 使用道具 举报
Super_Class 发表于 2013-6-16 10:37
有自动转型
short s1 = 1;
s1 += 1;

恩,应该是这样,系统自动把他转为了short
回复 使用道具 举报
short i = (short)500000000; //这个表达式明显超出范围,而java编译器不会报错,这个说明强制类型转换的时候,java 编译器 检查限制会变弱。
回复 使用道具 举报
Heart 中级黑马 2013-6-16 17:23:44
7#
toShareBeauty 发表于 2013-6-16 16:53
楼主,借你这个问题,我把我的总结分享给大家:
在类型转换这里,
从数据类型来看有两种类型转换,一种是基 ...

恩,讲解的很明白,很透彻,支持下
回复 使用道具 举报
Heart 发表于 2013-6-16 17:23
恩,讲解的很明白,很透彻,支持下

感谢你的点评
回复 使用道具 举报
窃以为s1 = s1 + 1是先把s1+1的结果存储到一块对应int类型的内存空间, 之后再将其赋给short型的s1, 需要强制类型转换.

而s1 += 1, 直接就在s1对应的内存空间上就加了, 压根没有开辟一块对应int类型的内存空间.

不知道对不对. 前辈指教
回复 使用道具 举报
楼主您好~帖子长时间未作出回答,我已经将您的帖子改成已解决。如果有问题的话可以私密我哦~
回复 使用道具 举报
说真的,这个问题钻牛角尖了。

首先,明确运算符的区别。
+运算,是不自动赋值的,需要两步操作,先做加法再赋值,在运算过程中并不会有自动的类型转换。

+=运算,其实是一步操作,很特殊,里面是由自动类型转换的,相当于你手动的进行了类型转换,这是运算符的一个机制,基本效果知识相当于而已,真正的等效应该是这样:
类型1  s1=1;
s1=(类型2)(s1+1);


类型1 s1=1;
s1+=1;
这是等效的,加上类型转换才算等效,运算符的实现机制不一样,只要算因就是这。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马