黑马程序员技术交流社区

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

作者: 钟伟杰    时间: 2013-4-23 02:33
标题: 基本数据类型包装类问题
本帖最后由 钟伟杰 于 2013-4-23 11:06 编辑

class IntegerTest
{
       public static void main(String[] args)
       {
              Integer m = 128;
              Integer n = 128;
              System.out.println(m==n);  //fale
              Integer a = 127;
              Integer b = 127;
              System.out.println(a==b);     //true
       }
}

代码中Integer对象自动拆箱成int类型比较两个数值是否相等,结果显示当取值大于127时为false,
Integer是int的封装对象啊,怎么取值是byte范围呢?能解释一下吗?

作者: 续圆凯    时间: 2013-4-23 02:42
由于自动装包,它们其实都是装在一个Integer对象中。
但是java编译器在1.5版本中,对原型的自动装包是有一个规定的,对于boolean,byte相同的值放在同一个包装器对象中,
char<=127的放在同一个包装对象中,short和int在-128到127之间的数据放在同一个包装对象中。
作者: 沈浩    时间: 2013-4-23 02:55
在给Integer赋值时,实际上是自动装箱的过程,也就是调用了Integer.valueOf(int)方法,当这个值大于等于-128并且小于等于127时使用常量池.

也就是说
Integer -128~127实际上你可以看成是整形int,Interger 128以上的数值就不能看成int了,他是对象,两个值相同的不同的对象如果用==判断肯定是不等的,可以用equals判断。
作者: 陈迎春    时间: 2013-4-23 09:17
沈浩 发表于 2013-4-23 02:55
在给Integer赋值时,实际上是自动装箱的过程,也就是调用了Integer.valueOf(int)方法,当这个值大于等于-12 ...

我也不是很清楚,看了你们的解答,懂了,谢谢啊、、、
作者: 陈迎春    时间: 2013-4-23 09:20
续圆凯 发表于 2013-4-23 02:42
由于自动装包,它们其实都是装在一个Integer对象中。
但是java编译器在1.5版本中,对原型的自动装包是有一个 ...

咦,你这样说是不是也说明char,boolean,short 也有自动装箱,拆箱功能吗?

这样写对不?

Char a = 'a';
Char b = 'b';

System.out.println(a==b);//是true吗?因为a=97,b=98 <=你说的127、、、
作者: 续圆凯    时间: 2013-4-23 11:55
从JDK1.5版本开始引用自动装箱和自动拆箱特性,主要的目的是方便封装类和基本类型之间的转化,该特性允许基本数据类型之间直接相互赋值.

Character<=127并不代表所有 在范围内的 都可以是一个对象, 只有在这个范围内的两个相同数值的才被视为一个对象, 如果超出这个范围的话

你定义两个数值相同的Character ,内存中会生成两个对象。




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