目录
包装类的出现
包装类的出现时为了解决普通数据类型的数据不具有对象的特征的问题,对于普通的数据类型而言,它不具有方法、属性和对象之间的交互,包装类的出现就是为了解决这个问题
包装类与基本数据类型之间的对应关系
如上图所示,基本数据类型和包装类有着一一对应的关系,从上图可以看出包装类的名字和基本数据类型的名字有着一些规律,我们在记忆的时候,可以先记住特殊的,比如Integer和Character这两个,剩下的就按照规律记忆即可,这里的规律就是将基本数据类型的首字母大写
通过基本数据和包装类的相互转换,就可以实现基本数据类型也可以拥有对象的特征,他们转换的过程称为装箱和拆箱(在后面会讲到)
包装类常用方法
包装类是放在java.lang包中的
从查阅的API来看,可以看出java中的包装类基本都是使用final修饰的,所以是不能够被继承的
这里给一个学习的小Tip,对于包装类的方法有那么多,不用一次性全部记住,只要记住几个常用的就可以了,其他的方法你可以通过查阅API的方式进行学习(对于我而言,常用的意思就是:我用过的,其实也不用刻意去记,要用的时候直接查一下就好了,查多了,也就记住了,记性不好的可以不用记,或者记一个即可,因为做人最重要的是开心啦!)
通过查询API可以发现,就是所有的数值型包装类都继承自Number类(如果要问数值型的基本数据有哪些,下图就有)
下面讲一些常用的方法(以Integer为例)
intValue(在进行手动拆箱的时候会用到)
valueOf(这个方法其实是在自动装箱的时候会执行的方法,虽然我们没有写)
还有一个valueOf(这个方法和上面的方法区别就在于参数不一样,这个可以用于将字符串转换为int类型的数据,转换为int类型的数据之前是先转换为Integer类型的数据,再通过自动拆箱的操作,变成了基本数据类型int)
parseInt(这个方法也是可以用于将字符串转换为int类型的数据)
toString(这个方法可以用于将基本数据类型转换为字符串类型的数据)
基本数据类型和包装类之间的转换(拆箱和装箱)
对于基本数据类型和包装类之间的转换中的拆箱和装箱这两个概念,可以这样理解,把箱子理解成为包装类,把东西理解成为基本数据类型,如果你想要让基本数据类型具备包装类的特点,那么就把它放到箱子里头,那么它就会具有箱子的功能
装箱分为自动装箱和手动装箱,自动装箱就是直接将基本数据类型赋值给包装类的对象引用,手动装箱就是使用包装类的构造方法,让基本数据类型作为构造方法的参数(代码如下)
拆箱也分为两类,一是自动拆箱,自动拆箱就是将包装类对象直接赋值给其对应的基本数据类型,二是手动拆箱,手动拆箱就是使用包装类中的方法,我们拿Integer类举例,如果想要把Integer类型的对象转换为int类型的数据,那么就可以使用intValue方法(代码示例如下)
当然对于Integer包装类对象还可以将其转换为doule,或者是其他的基本数据类型,通过查阅API,可以发现方法如下
基本数据类型和字符串之间的转换
基本数据类型转换为字符串:这里拿int类型举例,如果想要将int类型的数据转换为字符串,用Integer包装类中的toString方法,将基本数据类型的变量作为toString方法的参数即可
字符串转换为基本数据类型:这里还是拿int类型举例,如果想要把一个字符串转变为int类型的数据,那么就可以使用Integer包装类中的parseInt方法或者是valueOf方法都可以
示例代码如下
这里会有一个疑问,如果我放入toString中的参数不是int型呢?答案是会报错,我查阅了API,如下(发现你的参数必须要是int型,当然这里是以Integer包装类为例)
如果出现了上面这个疑问,肯定又会出现一个疑问,那就是如果使用Integer中的parseInt方法的时候,放入的参数不是能够转化为int类型的字符串的时候,这时候会出现什么情况呢?答案是会出现 java.lang.NumberFormatException异常,通过查阅API也可以发现这个问题,根据抛出异常的解释中,如果字符串不包含一个可分析的Integer数据,那么就会报错,从字面翻译是这样,但是我试着包含了可以解析的数据,这里说明一下,是包含,后面发现还是会抛出异常,那么可以肯定这句话的意思就是字符串必须是完全的整数形式,只是类型是String而已
需要知道的几点知识(上)
包装类对象的初始值,因为包装类对象是属于引用型,所以初始值为null,基本类型的初始值如下图
这里举一个例子,空指针的例子,下面这段代码
这里就会出现一个空指针的问题,因为没有对对象i进行赋值,i的初始值是null因此出现了空指针异常
需要知道的几点知识(中)
包装类对象之间的比较
结果一:这里使用了new关键字,指向的都是新开辟的空间,所以引用地址不一样,因此为false
结果二:这里完成的是一个自动拆箱的操作,将three对象变成了int类型的数据,因此可以和100进行大小的比较,结果是true
结果三:其实在进行自动装箱的时候,核心就是valueOf这个方法。在使用valueOf方法的时候,会在内存中产生一个缓存区,如果参数在(-128,127)之间,那么就会在缓存区中寻找是否存在这样一个变量,如果不存在,那么就要使用new实例化一个Integer示例对象,因此这里的答案是true
结果五:根据对象池概念使用的范围,这里的答案就是false,因为超出了范围,范围为-128到127
需要知道的几点知识(下)
上图的意思是:在包装类中除了Float和Double,其他都是可以应用对象池概念的