黑马程序员技术交流社区

标题: 一个基础小问题 [打印本页]

作者: 王晓斌    时间: 2013-1-23 17:21
标题: 一个基础小问题
本帖最后由 张向辉 于 2013-1-23 19:50 编辑

public void test()
{
byte b=0;
b='a'+2;
System.out.println(b);
}
代码如上,理论上说,'a'占两个字节,2占四个字节,不能直接赋值给byte,但这个代码却能通过编译,并输出正确结果。不止是2和'a',只要相加的和不超过byte的范围,竟然都不会报错!为什么呢?
作者: 刘军亭    时间: 2013-1-23 18:05
public void test()
{
byte b=0;                        //b是byte类型。
b='a'+2;                         字符'a‘+2运算的时候会把 a 转换成自己对应的数值来和2进行+运算。得到的结果在赋值给b。'a'不能直接赋值给byte类型,因为它是char类型的。
System.out.println(b);
}
作者: 马志军    时间: 2013-1-23 18:05
char型字符a与int型2相加,a自动向上转型为int型97,结果99再赋给byte型的b,截取最低8位赋给b。即使结果超过byte范围,也可以,只不过精度问题,只保留最低8位
作者: 胥文    时间: 2013-1-23 19:03
用继承的思想来帮你回答这个问题
首先byte是1个字节,char字节有2个字节,而int字节有4个字节,我们可以认为char继承了byte,而int可以说继承了char(从值得范围来考虑是可以这么理解的)
byte  b = 'a' +2 //可以当做父类的引用指想自己的子类,编译看左边,运行看右边, (备注:如果父类没有这个方法,即超出父类的范围,就会报错,如果父类有这个方法就在父类的范围类,所以就会运行正常)
求技术分,我可是想了半天,突然觉得他们有这个共性,呵呵,觉得继承还有这个用处还是很开心的
还要谢谢老兄的提问,虽然是一个小问题,但让我又有了新的理解
作者: Rancho_Gump    时间: 2013-1-23 19:48
胥文 发表于 2013-1-23 19:03
用继承的思想来帮你回答这个问题
首先byte是1个字节,char字节有2个字节,而int字节有4个字节,我们可以认 ...

其实 看完你的解释 喔喔 更晕了   呵呵
作者: 王晓斌    时间: 2013-1-23 19:55
标题: RE: 一个基础小问题
马志军 发表于 2013-1-23 18:05
char型字符a与int型2相加,a自动向上转型为int型97,结果99再赋给byte型的b,截取最低8位赋给b。即使结果超 ...

老兄,如果把一个int型数据赋给byte是会直接报错的,需要强制转换~但此处没有进行强转!却没有任何提示~~这才是诡异的地方~
作者: 王晓斌    时间: 2013-1-23 19:57
标题: RE: 一个基础小问题
张向辉 发表于 2013-1-23 19:48
其实 看完你的解释 喔喔 更晕了   呵呵

我也晕了~不知道在底层虚拟机怎么处理了~~
作者: 范天成    时间: 2013-1-23 19:57
public void test()
{
byte b=0;                        //b是byte类型。
b='a'+2;                         //***
System.out.println(b);
}

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

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

呵呵  其实你的解释很别致,能和继承联想起来,很有意思。很赞啊,所以才给你技术分。至少可以肯定你基础很扎实,也很着迷JAVA,以后还得请你多多在论坛上活动啊,共同交流,共同进步!:)
作者: 朱玉玺    时间: 2013-1-31 11:55
刘军亭 发表于 2013-1-23 18:05
public void test()
{
byte b=0;                        //b是byte类型。
  1. byte b=0;
  2. b='a';
复制代码
编译可以通过~




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