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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 段光宇 中级黑马   /  2013-11-14 22:54  /  1402 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

以下代码哪个是正确的?为什么?
a. byte b = 1 + 1;     
b. byte b = 1; b = b + 1;
c. byte b = 1; b = b += 1;   
d. byte b = 1; b = ++b;  

关于这个问题我实验了一下,b是肯定错的,我的解释是因为“byte b = 1; b = b + 1; ”语句相当于“[byte] b = [byte] b + [int] 1”语句,b自动转型为int与1做加法,结果是int类型,把int类型赋给byte类型b,所以错误。
而a,c,d都可以运行没有报错,但是我又不能解释这三个为什么正确,求大神为小弟答疑解惑。

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 勤奋好用的好少年。知道看书~

查看全部评分

7 个回复

倒序浏览
a选项也可以解释通了,b为byte,结果值为2,正确。就是c和d怎么解释呢?
求大神!翻了好多书了!
回复 使用道具 举报
FFF 金牌黑马 2013-11-14 23:14:38
藤椅
本帖最后由 FFF 于 2013-11-14 23:16 编辑
  1.       
  2. /**
  3. * 以下代码哪个是正确的?为什么?
  4. *a. byte b = 1 + 1;     
  5. *b. byte b = 1; b = b + 1;
  6. *c. byte b = 1; b = b += 1;   
  7. *d. byte b = 1; b = ++b;  
  8. *
  9. * @autho
  10. */
  11. public static void main(String args[]){
  12.         
  13.          //编译通过。等价于byte = 2;因为右边是常量,其值固定,
  14.                 //若在byte型的范围内,编译器会自动完成强制转换;若不在范围内,则编译失败。
  15.     byte b = 1 + 1;
  16.    
  17.     //编译失败。b是变量,编译器编译时并不会知道b具体是多少
  18.     //(编译时不会赋值,所以不知道b是多少),所以会认为b是所有可能的值,
  19.     //因此b+1不能通过编译。正确为: b = (byte) (b + 1);
  20.     //byte b = 1;
  21.     //b = b + 1;
  22.    
  23.     //编译通过。+=是一个赋值运算符,加和赋值是一步完成的,
  24.     //含有强制类型转换。等价于b = b = (byte)(b+1);
  25.     //byte b = 1;
  26.     b = b += 1;
  27.    
  28.     //编译通过。++是自增运算符,自身加1再赋值给自己,
  29.     //加1和赋值也是一步完成的,且不会改变变量的类型(含有强制类型转换)。   
  30.       //byte b = 1;
  31.       b = ++b;
  32.         }
复制代码
回复 使用道具 举报
a. byte b = 1 + 1;     //这个是两个常量相加,
jvm虚拟界对常量有优化机制,2没有超过byte的取之范围,就不会报错

b. byte b = 1; b = b + 1;

这个你说对了

c. byte b = 1; b = b += 1;   
这个选项是因为b+=1就是b=(byte)(b+1)

d. byte b = 1; b = ++b;
这个同上

jvm对常量的优化随处可见
String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2)//此处为true
也是因为常量优化机制,将所有的常量优化成一个常量

String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c";
System.out.println(s3 == s2); //此处为false

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

回复 使用道具 举报
毕老师视频里有讲过类型转换的深层原理,在算法那一块
a.c,d选项对的原因是,它们在底层来讲会自动给它们相互之间进行转换。
a, 1+1都是int类型,但是在底层把它们转为byte类型了,它们的范围也在byte类型之内
c, b= b+=1,这个主要看右边,在底层,b+=1相当于b=(byte)(b+1),把它们强转了
d,++b。也是在底层强转,也相当于(byte)(b+1)了
回复 使用道具 举报

懂了!解释得真详细,谢谢
回复 使用道具 举报
Sasson 发表于 2013-11-14 23:21
a. byte b = 1 + 1;     //这个是两个常量相加,
jvm虚拟界对常量有优化机制,2没有超过byte的取之范围,就 ...

前面都看懂了,只是最后有疑问
这一段
String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c";
System.out.println(s3 == s2); //此处为false
这里s3和s2的值是相同的,是什么原因导致s3==s2返回false呢
回复 使用道具 举报
dolphin 发表于 2013-11-14 23:49
毕老师视频里有讲过类型转换的深层原理,在算法那一块
a.c,d选项对的原因是,它们在底层来讲会自动给它们相 ...

感谢你的解答,懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马