博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java装箱拆箱
阅读量:6997 次
发布时间:2019-06-27

本文共 1410 字,大约阅读时间需要 4 分钟。

基本数据类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。 

一般我们要创建一个类的对象的时候,我们会这样:

 Class a = new Class(parameter);

 

装箱:

 当我们创建一个Integer对象时,却可以这样:

 Integer i = 100; (注意:不是 int i = 100; )

Integer i = 100实际上是 Integer i = Integer.valueOf(100);此即基本数据类型的自动装箱功能。

 

PS:当 Integer i = XX XX不在valueOf的范围(-128~127)内时,Integer i = XX归根结底就是Integer i = new Integer(XX)

 

拆箱:

Integer i = new Integer(333);

int j = i;//自动取出其值

 

InvalueOf源码如下:

public static Integer valueOf(int i) {

 final int offset = 128;
 if (i >= -128 && i <= 127) { // must cache
     return IntegerCache.cache[i + offset];
 }
        return new Integer(i);
 }

当方法的参数小于等于127和大约等于-128时,会始终只在内存中存在一个相同数值的对象,

Integer i = 100;

Integer j = 100;

i和j指会向同一个对象。

不明白的可以再去看看Integer中的私有类IntegerCache,第一次初始化的时候它就会造出来256个对象。

 

 

装箱和拆箱的例子,从基本类型对应的类到Object的转换,也是装箱和拆箱的一个用法:

 

class fu{

 int i=1111;
}

class zi extends fu{

 int j =2222;
}

public class Test {

 /**

  * @param args
  */
 public static void main(String args[]) {
  Integer a=new Integer(333);
  m31(a);
  zhuangxiangTest(new zi());
  
  Integer c = new Integer(128);
  Object s = c;
  Integer x = (Integer) s;//这一句是为了试一下Integer x = s;会不会“拆箱”,结果证明同其它的父子继承一样,不转换类型会报错
  System.out.println(s);
 }

 public static void m31(Object i) {

  System.out.println(i.getClass());//这里不需要转换,自动就转换了
 }
 
 public static void zhuangxiangTest(fu x) {
  zi i = (zi)x;//多一步转换否则下面这句是行不通的
  System.out.println(i.j);
 }
}

 

 

 

另外:

String str = "a"也是装箱,应该相当于String str = "a".intern();

intern是一个本地方法,它会去内存中检查是否有这个常量。

转载地址:http://ptavl.baihongyu.com/

你可能感兴趣的文章
ADF 客户端代码调用服务器方法
查看>>
C++输入cin详解
查看>>
java与openssl的rsa算法互用
查看>>
Python strip lstrip rstrip使用方法
查看>>
Codeforces Round #268 (Div. 2) c
查看>>
如果后台的Activity由于某原因被系统回收了,如何在被系统回收之前保存当前状态?...
查看>>
postgresql 自动备份
查看>>
读写文件之日志文件
查看>>
win7 远程桌面凭证不工作
查看>>
centos 启动多台zookeeper
查看>>
NASA研制3D食物打印机:原料或取自昆虫
查看>>
彭斌_无人机的发展与未来
查看>>
OpenSSLRSAWrapper
查看>>
Cocoa Application Start Sequence
查看>>
图像处理控件ImageGear for .NET教程如何为应用程序 添加DICOM功能(2)
查看>>
基于Video4Linux的视频采集模块开发(转)
查看>>
cookies,sessionStorage 和 localStorage 的区别
查看>>
android中Tab设计中:tab中的listview最下面一部分被tab遮盖的解决
查看>>
CentOS下编译php时的一些典型错误及解决办法.
查看>>
Hg Mercurial版本管理介绍
查看>>