包装类的概念与包装类_装箱与拆箱
包装类
概述
Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下:
包装类:
基本数据类型的数据,使用起来非常的方便但是没有对应的方法来操作这些数据所以我们可以使用一个类,把基本类型的数据包装起来这个类叫包装类
在包装类中可以定义一些方法用来操作基本类型的数据
每个基本数据类型都提供了一个包装类,使用对应的包装类对象,对对应类型的数据进行了封装,又提供相应的方法对其封装的数据可以进行一些操作
Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的。基本类型的数据不具备"对象"的特性(没有成员变量和成员方法可以调用),因此,java为每种数据类型分别设计了对应的类,即包装类。
众所周知,我们Java语言的特性是面向对象。所以在Java中任何东西都是以类而存在的,但是我们的基本数据类型,却不属于类。在一些应用的场景下,它限制了我们的使用。比如我们无法使用Object里的方法呀(因为任何类都继承自Object)。无法参与转型,泛型,反射等使用。Java的开发人员为了弥补这个缺陷,于是为我们的八大数据类型各种设计了一个包装类,将基本数据类型和一些方法包封装起来成为保证类,下面是八大基本数据类型对应的包装类。除了int和char其他都是将头字母变为大写即可,其中我们用的最多的是Integer。
包装类_装箱与拆箱
什么是装箱与拆箱?.
基本类型与对应的包装类对象之间,来回转换的过程称为"装箱"与"拆箱”:
在JavaSE5版本前,想要生成一个Integer对象,我们需要像大部分对象通过new调用构造方法来创建(手动实例化方法)
Integer a=new Integer(10);
之后为了简化我们的书写,包装类对象的声明可以像基本数据类型一样进行直接的赋值使用,像下面即可(自动装箱方法)
Integer a=10;
在我们传入对应的基本数据类型后得到一个包装类对象,这个过程就是装箱,所以装箱简略而言就是将基本数据类型转化成引用类型。那什么是拆箱呢?和装箱相对而言,那拆箱就是将引用类型转化成基本数据类型
Integer a=10;//装箱 int x=a;//拆箱
装箱:基本数据类型转化为引用类型的过程
拆箱:引用类型转化为基本数据类型的过程
包装类的使用场景
光明白包装类的拆箱与装箱却不了解使用场景,那我们学习了就毫无意义。下面为大家介绍一些常见的使用场景
字符串与基本数据类型的转换
在我们学习过程中,肯定遇到过这样一种情况,有一个纯数字的字符串,想将它变为int类型,却发现是不支持的,就像这样
String a="1234567"; int b=a;(错误的,Java是不支持的)
但是Integer提供却提供了将字符串转化为Integer的方法valueof()。在这个过程中是先将String转化为Integer,然后再拆箱成int类型,就像这样
String a="1234567"; int b= Integer.valueOf(a);
但其实我们将String转化为int时更常用的是parseInt()方法,它是将String当做一个十进制的整数解析。
String a="1234567"; int b= Integer.parseInt(a);
总结:之所以要先讲valueof()是因为它先返回的是我们的包装类对象再变为基本数据类型,更加直观地体现出拆箱的过程。平时使用时还是推荐大家用parseInt()方法。这里只是以Integer为例。String也可以转换为其他基本数据类型,希望大家去了解和尝试。说不定哪天就遇上了需要转化的场景。
简化对基本数据类型的操作
我们都知道我们平时的整数都是十进制的,在某些情况下,比如做算法时,它可能需要我们转化为二进制、八进制、十六进制等等。有的同学居然去写一个非常复杂方法进行转换,这个问题Integer早就为我们想到了,提供了非常方便的方法
public class Demo2 { public static void main(String[] args) { int a=100; System.out.println(Integer.toBinaryString(a));//1100100 二进制 System.out.println(Integer.toOctalString(a));//144 八进制 System.out.println(Integer.toHexString(a));//64 十六进制 } }
这时候肯定有人不服,你这些二八十六都是常见的进制,万一它要我转化什么三进制四进制五进制咋办?你还真别说,Integer还真不怕你杠,在Integer中重写了一个两参的toString方法。
static String toString (int i int radix)
返回用第二个参数指定基数表示的第一个参数的字符串表示形式
参数i是你需要转化的数,参数radix是你需要转化的进制。我们直接来尝试使用一下
public static void main(String[] args) { int a=100; System.out.println(Integer.toString(a, 3)); //10201 将a转化为三进制 System.out.println(Integer.toString(a,4));//1210 将a转化为四进制 System.out.println(Integer.toString(a,5));//400 将a转化为五进制 }
总结:到这你肯定已经感受到了包装类的强大了吧,它其实还有更多强大的功能,大家可以自己去jdk的文档了解。其他包装类的API使用较少,如果大家感兴趣的话也可以去了解一下。如果哪天能用上,那它一定能帮你解决不少的麻烦。
包装类_装箱与拆箱
package Integer_Demo01; /* 装箱:把基本类型的数据,包装到包装类中(基本类型的数据->包装类) 构造方法: Integer(int value)构造一个新分配的Integer对象,它表示指定的 int值。 Integer(String s)构造一个新分配的Integer对象,它表示string参数所指示的 int值。 传递的字符串,必须是基本类型的字符串,否则会抛出异常“100”正确“a”抛异常 静态方法: static Integer value0f(int i)返回一个表示指定的 int值的Integer实例。 static Integer value0f (String s)返回保存指定的 string 的值的Integer对象。 拆箱:在包装类中取出基本类型的数据(包装类->基本类型的数据) 成员方法: int intvaLue()以int类型返回该Integer的值。 */ public class Demo01_Integer { public static void main(String[] args) { //装箱:把基本类型的数据,包装到包装类中(基本类型的数据->包装类) // 构造方法 Integer integer1 = new Integer(1);//方法上有横线,说明方法过时了 System.out.println(integer1); //1 重写了toString方法 Integer integer2 = new Integer(1); System.out.println(integer2); //静态方法 Integer integer3 = Integer.valueOf(1); System.out.println(integer1); //Integer integer4 = Integer.valueOf("a");//NumberFormatException数字格式化异常 Integer integer4 = Integer.valueOf(1); System.out.println(integer4); //拆箱:在包装类中取出基本类型的数据(包装类->基本类型的数据) int i = integer1.intValue(); System.out.println(i); } }