thinking in java test2.11练习(9)之java装箱拆箱

题目:编写一个程序,展示自动包装功能对所有的基本类型和包装类型都起作用。

基本类型指九大基本数据类型boolean,char,byte,short,int,long,float,double,void
与之对应的包装器类型分别为
Boolean,Character,Byte,Short,Integer,Long,Float,Double,Void

我们知道,基本数据类型是需要特殊对待的类型,声明一个int类型的变量可以有如下两种写法:
int i = 0;
Integer j = new Integer(0);
第一种写法是常见的写法,那么为什么要有这种写法呢?这似乎有违万物皆对象的面向对象基本思想啊。
我们知道当程序运行时,操作系统会分配一块内存给它,jvm将这块内存分为堆空间和栈空间(其实还有代码空间等等,暂不讨论),new出来的对象是存放到堆里,但是对于一个小的简单的变量,将起放在堆里不是很有效(至于为什么笔者也不知道,这肯定涉及到底层的内容),所以对于基本数据类型java采取与C和C++一样的方法,不是使用new来创建,而是创建一个并非是引用的“自动”变量,这个变量放在堆栈中,这会更加高效。
所以我们知道上面两种写法是不同的,一个是创建一个自动变量,(在内存上是在堆栈中分出一块区域,区域里存储的是自动变量的值,区域名既等号前面的名字,所以说它并非是“引用”),另一个是创建一个引用,new一个新对象,再用引用指向对象。

那假如将这两种写法混搭着写呢?例如:
Integer j = 5;
按道理讲这是不行的,前半段创了个引用,后半段又直接一个数据,你告诉编译器你到底要怎样。
不过其实在java SE5之后,这种写法就可行了。Java SE5的自动包装功能能自动的将基本类型转换为包装器类型。比如上面的例子,编译器读取前半段创建一个引用的代码(Integer j)后,发现后半段(5)没有new一个新对象,而是直接一个数字这是jvm就会自动的将数据5包装成一个新的Integer对象,并将其值置5。也就是以上代码看成是Integer j = new Integer(5);
这就是题目里所说的自动包装功能,又称之为装箱。
那反过来行不行?比如:
int i = j;(或者int i = new Integer(5))这里的j就是上文的Integer j;
这也是可以的,jvm会自动的将Integet j视作5,也就是将其看成int i = 5;这是反向转换,称之为拆箱。(当我们进行运算时,包装类型也就是对象是无法直接进行算数运算的,所以我们需要用到拆箱)

讲到这里,题目就很好做了。代码如下:

public class test2_9 {
    public static void main(String[] args) {
        Boolean b = false;
        Character c = 'x';
        Byte aByte = 1;
        Short s = 5;
        Integer i = 10;
        Long l = 123l;
        Float f = 1.2f;
        Double d = 1.23;
        System.out.println("b: " + b);
        System.out.println("c: " + c);
        System.out.println("aByte: " + aByte);
        System.out.println("s: " + s);
        System.out.println("i: " + i);
        System.out.println("l: " + l);
        System.out.println("f: " + f);
        System.out.println("d: " + d);
    }
}

控制台输出如下:
b: false
c: x
aByte: 1
s: 5
i: 10
l: 123
f: 1.2
d: 1.23

以上。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值