什么是包装类?
在Java里一切都是对象,除了Java中的基本数据类型(byte,short,int,long,char,float,double,boolean)不是面向对象的,这在实际使用时存在很多的不便,为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class),有些地方也翻译为外覆类或数据类型类。
- 包装类对应关系
- 包装类均位于java.lang包
- 包装类的用途
- a、作为和基本数据类型对应的类类型存在,方便涉及到对象的操作。
- b、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法。
Auto-box自动装箱功能
什么是Auto-boxing?
首先不说定义,先假设没有Autoboxing和unboxing功能,我们使用包装类就如同一般类一样
这样我们创建对象就要这样:
//1.用平时创建类的方法创建包装类 int x=100; Integer w_x=new Integer(1000);//符合先声明new对象 double z=500.567; Double w_z=new Double(456.789); float f='Y'; Float w_f=new Float('Y'); String w_s=new String("yes");
然后我们如何返回实例的值呢?当然用到方法了:
//2.返回这些的值 System.out.println("----------------"); System.out.println("w_x="+w_z.intValue()); System.out.println("w_z="+w_z.doubleValue()); System.out.println("w_f="+w_f.floatValue()); System.out.println("w_s="+w_s); /*输出: w_x=456 w_z=456.789 w_f=89.0 w_s=yes */
是不是很麻烦?不麻烦?那就让我们见识一下Autoboxing和unboxing的优点,在JDK1.5之后,有了这个特性
当我们需要使用包装类时候,在语法上首先可以和基本类型一样,但是因为类又有很多方法可以使用,所以
包类的功能增强了不少如下:
//4.JDK 1.5之后的AutoBOX功能 //如基本类型一样复制,自动装箱供转换为 new Integer(xxx); Integer l1=100; Double d1=789.123; Character c1='n'; Boolean b1=false;//只能true或者false String s1="Auto-box"; //直接拆箱子 System.out.println("----------------"); System.out.println(l1); System.out.println(d1); System.out.println(c1); System.out.println(b1); System.out.println(s1); /*输出: ---------------- 100 789.123 n false Auto-box ---------------- */
是不是很方便?在赋值时候有了这个特性,编译器自动帮我们完成一些工作。
自动装箱也存在一些特殊性,例如在用"=="我们可以比较两个基本类型是否相等,
那么我们能不能用此比较包装类是否相等呢?
//1.包装类用== 比较大小 System.out.println("----------------"); System.out.println("Integer(2)是否等于Integer(2)? "+(new Integer(2)==new Integer(2))); //输出 false ,引用类型用==判断只有指向同一个对象才返回true //Auto-box情况下的不同情形 Integer i5=3; Integer i6=3; System.out.println("I6是否等于I5? "+(i6==i5));//返回true Integer i7=128; Integer i8=128; System.out.println("I7是否等于I8? "+(i7==i8));//返回false /*为什么返回false? 因为Auto把-128~127证书自动装箱为一个Integer实例,还放入一个数组 因此每次赋值在这个范围总是指向这个实例的这个数字,所以指向一个地址, 超过这个范围就要重新创造new一个新的实例 */ System.out.println("----------------"); ---------------- Integer(2)是否等于Integer(2)? false I6是否等于I5? true I7是否等于I8? false ----------------正如注释所说,因为引用型用"=="判断相等的准则是是否指向同一个对象。
我们一般用compare()方法比较两个数的大小关系如下:
//2.用compare方法比较大小 System.out.println("Integer.compare(5,5)="+Integer.compare(5,3));//前>后返回1 System.out.println("Double.compare(789.321,123.789)="+Double.compare(789.123,123.789)); System.out.println("Boolean.compare(true,true)="+Boolean.compare(true,true)); /* Integer.compare(5,5)=1 Double.compare(789.321,123.789)=1 Boolean.compare(true,true)=0 */
在Autoboxing中,我们可以进行运算或者转换
/5.包装类的一些方法 //利用包装类构造器和静态方法实现字符串与Integer的转换 System.out.println("----------------"); String s2="123"; int it1=Integer.parseInt(s2); int it2=new Integer(s2); System.out.println("it1="+it1+" it2="+it2); String s3="563.236"; float ft1=Float.parseFloat(s3); float ft2=new Float(s3); System.out.println("ft1="+ft1+" ft2="+ft2); /* ---------------- it1=123 it2=123 ft1=563.236 ft2=563.236 */ //6.基本类型转换为字符串 System.out.println("----------------"); String s4=String.valueOf(123.456f); System.out.println("s4="+s4); String s5=String.valueOf(636.56); System.out.println(s5); String s6=String.valueOf(true); System.out.println(s6); /* ---------------- s4=123.456 636.56 true ---------------- */
//7.包装类型的运算 int i99=10; Integer i9=789; Double d9=i9+789.652;//自动拆箱 System.out.println(d9); Short s9=123; Double d10=(double)i9+(double)s9;//不进行转换的话会提示并非Double型,不能通过编译 System.out.println(d10);
总结:
在许多情况下包装与解包装是由编译器自行完成的,给编码者带了很多便利性。
作者:YangGan出处: http://blog.csdn.net/incyanggan本文基于 署名 2.5 中国大陆 许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名Yanggan (包含链接).