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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© smile_joe 中级黑马   /  2013-4-19 23:05  /  1107 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 smile_joe 于 2013-4-20 19:24 编辑

在jdk 1.5 后出来自动装箱 自动拆箱新特新,学完后,感觉总是朦朦胧胧的,没有具体的那种感觉?
---------请帮忙分析下自动装箱,拆箱的原理/实现,什么时候可以直接用;什么时候有不能直接去用?十分感谢...

1 个回复

倒序浏览
本帖最后由 Neverbelazy 于 2013-4-20 01:13 编辑

1.当基本数据类参与数学运算时,可以直接被看做是 基本数据类型
2.当定义的函数需要 输入类型为基本数据类型时,也可以传入 相应的基本数据类型类
3.Integer 类中,当对象值在 -128~127之中时,对象在内存中是唯一的,任何引用都指向同一个对象;在其外,每一个新生成的对象都开辟新的空间
4.程序自动初始化时,初始化值是null;
5.基于3,4;自动装拆有风险
参看如下代码
  1. public class FinalTest {
  2.         static Integer i;
  3.         public static void main(String[] args){
  4.                 //
  5.                 Integer j=200;                        //局部对象,自动装箱
  6.                 System.out.println(j); //自动拆箱,输出200
  7.                 // Integer i; 初始化是0吗?
  8.                 System.out.println(i); //此时,i 是成员变量,输出的是null,此处不存在自动装箱初始化0
  9.                 //System.out.println(i+0); //此句报错
  10.                 i=200; //自动装箱,拆箱可以容许这样的代码
  11.                 System.out.println(i+0); // 自动装箱,输出200
  12.                
  13.                 // Integer 对象在 -128-127 值范围内,是在内存唯一的对象,所有引用指向同一个对象 之外则是不同对象
  14.                 System.out.println("i==j?:"+(i==j)); // 输出 false ,这个运算时直接比较的地址值
  15.                 System.out.println("i==j?:"+((i+0)==(j+0))); //输出true,运算了,装箱了。。。就true了
  16.                 i=100; j=100;
  17.                 System.out.println("i==j?:"+(i==j)); // 输出 false ,这个运算时直接比较的地址值,但是这个这两引用,j指向同一个对象
  18.                 //自己定义的函数中,也可以自动装箱
  19.                 testForFunction(i);               
  20.         }
  21.         public static void testForFunction(int x){
  22.                 System.out.println(x);
  23.         }
  24. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马