• Java菜鸟学习笔记--面向对象篇(十五):Wrapper Class包装类


    什么是包装类?

         


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





  • 相关阅读:
    Google Guava官方教程(中文版)
    maven POM.xml 标签详解
    Linux内存文件系统tmpfs(/dev/shm)详细介绍
    linux 如何查看目录的剩余空间大小?
    CSS position绝对定位absolute relative
    java 笔记
    js笔记
    AFNetworking监控网络状态以及下载的进度条显示
    HTTPS网络请求时plist文件的设置
    KVO监测tableView的滑动
  • 原文地址:https://www.cnblogs.com/aukle/p/3221580.html
Copyright © 2020-2023  润新知