什么是包装类?

     


 在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 (包含链接).

 





 

 

 

Copyright © 2024 冰天雪域
Powered by .NET 9.0 on Kubernetes