• java装箱拆箱


    基本数据类型的自动装箱(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是一个本地方法,它会去内存中检查是否有这个常量。

  • 相关阅读:
    JDBC 连接 MySQL 数据库
    通过java类的反射机制获取类的属性类型
    反射机制实例化类,并获取类中的属性、方法、和构造器
    java8u162反射机制的一个BUG
    Java反射关于getDeclaredMethods()和getMethods()的区别
    Java反射
    30天C#基础巩固------了解委托,string练习
    30天C#基础巩固------读写流(StreamWrite/StreamReader)
    30天C#基础巩固------集合,File(文件操作 ),Encoding处理字符集
    30天C#基础巩固------面向鸭子编程,关于string和File的练习
  • 原文地址:https://www.cnblogs.com/flying607/p/3418452.html
Copyright © 2020-2023  润新知