题目:编写一个程序,展示自动包装功能对所有的基本类型和包装类型都起作用。
基本类型指九大基本数据类型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
以上。