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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 李天甲 于 2012-6-4 16:40 编辑

看了基本数据类型的包装类Integer与基本数据类型int,对于之间的关系有些搞糊涂了。
在论坛中搜了搜以前同学们解答过的答案说:
java的数据类型有原始数据类型跟引用数据类型。
基本数据类型的包装类的作用就是将原始数据类型转换成引用数据类型——就是将原始数据类型当作对象进行操作

那么一般我们声明的
int x=100;
这样的操作中,x是作为对象存在的么?如果是的话,那么跟new Integer(100);生成的对象有什么不同么?
更详细的问题见下面代码的注释。。。
  1. class test{
  2.         public static void main(String[] args){
  3.                 int a=100;
  4.                 int b=100;
  5.                 Integer c=new Integer(100);   
  6.                 Integer d=a;
  7.                 baseTest base=new baseTest();
  8.                 /*
  9.                 下面这样调用时,的结果不太理解。
  10.                 */
  11.                 base.test(a,b); //结果是true可以理解。
  12.                 base.test(b,c); //结果是false?这个请教一下,为何两个对象不一致?
  13.                 base.test(a,d); //结果是true? 为啥又变得一致了呢?Integer d=a;传递了int的引用过去之后,没有生成新的类么?
  14.         }
  15. }
  16. class baseTest{
  17.         public void test(Object obj1,Object obj2){
  18.                 System.out.println(obj1==obj2);
  19.         }
  20. }
复制代码
请教大家。谢谢。

已解决,第三个true原因是100给的太小了,没跑跑出byte的范围,呵呵。

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 加油!

查看全部评分

6 个回复

倒序浏览
如果是两个基本数据类型而且在一个字节内的数字比较是相同的,但是你建立了对象,一个对象一个地址,所以两个比较地址值肯定是不一样的
回复 使用道具 举报
本帖最后由 唐辉辉 于 2012-6-4 16:23 编辑

int 不是对象。 可以用Integer转换成对象, 转换成对象后方便进行操作。
base.test(a,b); //结果是true可以理解。
这里在test比较的是值是否相同
base.test(b,c); //结果是false?这个请教一下,为何两个对象不一致?
这里是b的引用和c的引用做对比,因为c是一个对象的引用。比较的是对象的内存地址值。
base.test(a,d); //结果是true? 为啥又变得一致了呢?Integer d=a;传递了int的引用过去之后,没有生成新的类么?
因为d只是一个Integer的引用,指向了a。 会比较值。
回复 使用道具 举报
丰亚彬 发表于 2012-6-4 16:14
如果是两个基本数据类型而且在一个字节内的数字比较是相同的,但是你建立了对象,一个对象一个地址,所以两 ...

了解了,当我把数值改成50000,就全是false了,是不是都建立了不同对象了?
之后就仅为引用数据和原始数据类型的差别了是吧。
这样看来,int x=50000也是生成了单独的对象是吧。
回复 使用道具 举报
本帖最后由 古银平 于 2012-6-4 16:27 编辑
  1. class test{

  2.         public static void main(String[] args){

  3.                 int a=100;   //这样定义的变量实栈内存中的,给赋值以后指向对内存的100,那么定义的其他变量int b=100;也是b指向对内存的100.

  4.                 int b=100;

  5.                 Integer c=new Integer(100);   //new出来的对象的内容都会存储在堆内存,每一次new将会新建块内存,对象c将指向这块内存,它不会在指向原来那个100,而是会新建一个,他们的内存地址不一样

  6.                 Integer d=a;

  7.                 baseTest base=new baseTest();

  8.                 /*

  9.                 下面这样调用时,的结果不太理解。

  10.                 */

  11.                 base.test(a,b); //结果是true可以理解。

  12.                 base.test(b,c); //结果是false?这个请教一下,为何两个对象不一致?

  13.                 base.test(a,d); //结果是true? 为啥又变得一致了呢?Integer d=a;传递了int的引用过去之后,没有生成新的类么?

  14.         }

  15. }

  16. class baseTest{

  17.         public void test(Object obj1,Object obj2){

  18.                 System.out.println(obj1==obj2);

  19.         }

  20. }
复制代码
他们的区别:
int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。
在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。
另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。

评分

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

查看全部评分

回复 使用道具 举报
唐辉辉 发表于 2012-6-4 16:22
int 不是对象。 可以用Integer转换成对象, 转换成对象后方便进行操作。
base.test(a,b); //结果是true可以 ...

int 不是对象么??但是如果我将上面的代码改成50000这样,结果就全是false了,跟您说的不太一样啊。。。
  1. class test{
  2.         public static void main(String[] args){
  3.                 /*
  4.                 两个基本数据类型,而且在一个字节内的数字比较是相同的
  5.                 */
  6.                 int a=50000;
  7.                 int b=50000;
  8.                 Integer c=new Integer(50000);   
  9.                 Integer d=a;
  10.                 baseTest base=new baseTest();
  11.                 /*
  12.                 下面这样调用时,的结果不太理解。
  13.                 */
  14.                 base.test(a,b); //结果是false
  15.                 base.test(b,c); //结果是false
  16.                 base.test(a,d); //结果是false
  17.         }
  18. }
  19. class baseTest{
  20.         public void test(Object obj1,Object obj2){
  21.                 System.out.println(obj1==obj2);
  22.         }
  23. }
复制代码
回复 使用道具 举报
古银平 发表于 2012-6-4 16:25
他们的区别:
int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int ...

基本上了解了,
刚才第三个问题为true的原因是因为我给的值太小了,二楼给出了答案
不过果然是实践出真知。。。看了你的回答还是比较学知识呵呵。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马