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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王晓斌 中级黑马   /  2013-1-23 17:21  /  2079 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张向辉 于 2013-1-23 19:50 编辑

public void test()
{
byte b=0;
b='a'+2;
System.out.println(b);
}
代码如上,理论上说,'a'占两个字节,2占四个字节,不能直接赋值给byte,但这个代码却能通过编译,并输出正确结果。不止是2和'a',只要相加的和不超过byte的范围,竟然都不会报错!为什么呢?

评分

参与人数 1技术分 +1 收起 理由
Rancho_Gump + 1 神马都是浮云

查看全部评分

10 个回复

倒序浏览
public void test()
{
byte b=0;                        //b是byte类型。
b='a'+2;                         字符'a‘+2运算的时候会把 a 转换成自己对应的数值来和2进行+运算。得到的结果在赋值给b。'a'不能直接赋值给byte类型,因为它是char类型的。
System.out.println(b);
}

评分

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

查看全部评分

回复 使用道具 举报
char型字符a与int型2相加,a自动向上转型为int型97,结果99再赋给byte型的b,截取最低8位赋给b。即使结果超过byte范围,也可以,只不过精度问题,只保留最低8位

评分

参与人数 1黑马币 +9 收起 理由
Rancho_Gump + 9 赞一个!

查看全部评分

回复 使用道具 举报
用继承的思想来帮你回答这个问题
首先byte是1个字节,char字节有2个字节,而int字节有4个字节,我们可以认为char继承了byte,而int可以说继承了char(从值得范围来考虑是可以这么理解的)
byte  b = 'a' +2 //可以当做父类的引用指想自己的子类,编译看左边,运行看右边, (备注:如果父类没有这个方法,即超出父类的范围,就会报错,如果父类有这个方法就在父类的范围类,所以就会运行正常)
求技术分,我可是想了半天,突然觉得他们有这个共性,呵呵,觉得继承还有这个用处还是很开心的
还要谢谢老兄的提问,虽然是一个小问题,但让我又有了新的理解

评分

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

查看全部评分

回复 使用道具 举报
胥文 发表于 2013-1-23 19:03
用继承的思想来帮你回答这个问题
首先byte是1个字节,char字节有2个字节,而int字节有4个字节,我们可以认 ...

其实 看完你的解释 喔喔 更晕了   呵呵
回复 使用道具 举报

RE: 一个基础小问题

马志军 发表于 2013-1-23 18:05
char型字符a与int型2相加,a自动向上转型为int型97,结果99再赋给byte型的b,截取最低8位赋给b。即使结果超 ...

老兄,如果把一个int型数据赋给byte是会直接报错的,需要强制转换~但此处没有进行强转!却没有任何提示~~这才是诡异的地方~
回复 使用道具 举报

RE: 一个基础小问题

张向辉 发表于 2013-1-23 19:48
其实 看完你的解释 喔喔 更晕了   呵呵

我也晕了~不知道在底层虚拟机怎么处理了~~
回复 使用道具 举报
public void test()
{
byte b=0;                        //b是byte类型。
b='a'+2;                         //***
System.out.println(b);
}

因为你的这个表达式中右边只是涉及到了常量运算然后赋值,没有其他变量参与。如果“=”右边有一个非byte类型的变量参与了运算,编译就会报错。我理解的原因是你的这个表达式只在栈内存中开辟了一个byte类型内存,右面的运算值直接赋予变量。而涉及到其他变量的时候,是内存地址指向发生变化,就会报错。
回复 使用道具 举报
胥文 中级黑马 2013-1-23 20:18:35
9#
张向辉 发表于 2013-1-23 19:48
其实 看完你的解释 喔喔 更晕了   呵呵

我打个比方:假设byte型的的范围为1-10,而int型的范围是1-20,我们是不是可以说int继承了他的1-10,而自己又有自己的特点11-20
子类继承父类,就拥有父类的全部了,而自己还可以在定义自己的方法
当父类的引用指向自己的子类的时,如果是子类特有的方法是不是会报错啊(在这个题目中如果是11-20,那就是子类特有的方法,父类没有,所以要报错),其实这其中的思想是一样的
反正我觉得自己现在很清晰了,没有被理解还是有点小遗憾,但是自己还是很开心
回复 使用道具 举报
胥文 发表于 2013-1-23 20:18
我打个比方:假设byte型的的范围为1-10,而int型的范围是1-20,我们是不是可以说int继承了他的1-10,而自 ...

呵呵  其实你的解释很别致,能和继承联想起来,很有意思。很赞啊,所以才给你技术分。至少可以肯定你基础很扎实,也很着迷JAVA,以后还得请你多多在论坛上活动啊,共同交流,共同进步!:)
回复 使用道具 举报
刘军亭 发表于 2013-1-23 18:05
public void test()
{
byte b=0;                        //b是byte类型。
  1. byte b=0;
  2. b='a';
复制代码
编译可以通过~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马