Java学习笔记(疯狂Java讲义第三版)——包装类

包装类是什么?
就是Java语言为其中的8种基本数据类型(byte、short、char、int、long、float、double、boolean),分别定义了相应的引用类型。简单来讲就是为8种基本数据类型分别定义了相应的类。

为什么需要包装类?
首先,Java语言是面向对象的编程语言,面向对象的三大特性(继承、封装、多态)主要是通过类和对象实现的。而Java语言中的8个基本数据类型不是类更不是对象,所以是不支持面向对象的三大特性的,同时由8个基本数据类型定义的数据也不具备对象的特性(没有成员属性和成员方法)所以在有些场合使用起来是很不方便的。

哪些场合使用起来会不方便呢?
首先所有引用类型的变量都继承了Object类,都可以近似当成Object类型的变量使用。但基本数据类型的变量就不可以直接赋值给Object类定义的对象。如果有个方法是Object类型的参数,但实际需要的值却是2、3等数值,如果没有包装类的存在就比较难处理了(引用疯狂Java讲义第三版的原文),毕竟在没有包装类的情况下无法直接写成Object o1 = 2;这种形式。当然,现在有了包装类就可以这样直接写了。(这利用的是包装类的自动装箱和自动拆箱的功能中的自动装箱功能后面会介绍的到。)

为什么Java语言要保留8个基本数据类型而不是直接把它们封装成类呢?
疯狂Java讲义中的解释:
1.为了照顾程序员的传统系统。
2.可以进行简简单有效的数据处理,有些时候单纯的使用普通变量是比引用类型方便很多的,如简单的赋值操作等。

知识点:
一、8中包装类分别都是什么呢?
Byte、Short、Character、Integer、Long、Float、Double、Boolean

二、自动装箱和自动拆箱是什么意思?
先看自动装箱:通俗来讲,就是将基本数据类型直接赋值给相应的包装类变量。例如Integer a = 2;
再看自动拆箱:将包装类变量直接赋值给相应的基本数据类型变量。例如Integer a = 2;
int b = a;

最开始看这到这里的时候感觉没什么,自动装箱和自动拆箱只是实现了基本数据类型变量和相应包装类变量之间的直接赋值。但通过后来的学习,才意识到为了实现这一点系统进行了哪些转换。

如果没有自动装箱这一功能,想要把数值或者基本数据类型的变量赋值给相应的包装类类型变量是需要通过构造器来完成的。例如将数值2赋值给Integer类型的对象必须要这样写:
Integer a = new Integer(2);
如果没有自动拆箱的想要将上面的Integer类型的变量a赋值给int b也需要调用相应的成员方法例如:
Integer a = new Integer(2);创建包装类对象,将数值2赋值给该对象。
int b = a.intValue(); 返回包装类对象中存储的数值。赋值给变量b。
有了包装类的自动拆箱和自动装箱的功能之后,就可以简写成:
Integer a = 2;
int b = a;
在此处,使用起来就和基本数据类型之间的相互赋值的情况一样了。

特别注意:有了自动装箱和自动拆箱的功能能之后,要特别注意类型的一致。即不可以把Boolean类型的对象拆装给int类型,反之同理。

三、包装类还实现了基本数据类型和字符串数据类型之间的相互转换。
将字符串转换成基本数据类型:包装类提供了两种方式
方式1:利用包装类提供的构造器。例如:
int a = new Integer(“123”);//最后a中存储的int型数值123
方式2:利用包装类提供的静态方法(类方法)parseXxx(xxx);例如:
int a = Integer.parseInt(“123”);//最后a中存储的为int类型的数值123

将基本类型数据转换成字符串数据:应用String类提供的多个重载的valueOf()方法。
例如String str1 = String.valueOf(123);//最后str中存储的为字符串123
注意,这里乍一看是直接将基本数据类型中int类型的数据123抓换成了字符串123,但实际是系统是现将123转化成相应的包装类的数据类型(自动装箱),然后再转换成字符串数据类型。

特别指出:将基本数据类型转化为字符串数据类型有一个最简单的方式,例如:
String str = 123 + “”;//即将基本数据类型变量或者基本数据类型的数据利用"+“和任意字符串数据类型数据做"连接运算”。

包装类的作用:
1.实现基本数据类型和引用数据类型之间的转换。
2.特别应用实现字符数据类型和基本数据类型之间的转换。

四、包装类和基本数据类型及包装类数据类型和包装类数据类型之间的比较问题。
1.基本数据类型和包装类数据类型之间是数值的直接比较即:
int a =2; Integer b = 2;a和b只进行数值的比较,及a == b

2.包装类数据类型和包装类数据类型之间的比较。
首先,包装类数据类型属于引用数据类型,引用数据类型之间的比较实际比较的是地址,而不是进行数值的比较。按照此原则引用数据类型利用等号进行比较除非引用同一个对象否则都是不相等的。
例如:
Integer a = new Integer(2);
Integer b = new Integer(2);
此处a和b虽然数值相等,但是不是同一个对象所以肯定不相等。

特殊情况。
对于包装类来说,它会以缓存的形式创造出一定数量的变量。例如Integer中定义的一段源代码
static final Integer[] cache = new Integer[-(128) + 127 + 1];
//首先这句话的意思就是定义一个Integer类型的数组,数组长度是256。
for(int i = 0; i < cache.length; i++){
cache[i] = new integer(i - 128);
}//里面上面创建的Integer类型的数组cache来预先创建出256个Integer类型的对象。
//其中存储的数值是从-128到127。
简单来说,它预先创建除了256个Integer类型的对象,其中对象存储的数值分别是-128到127。所以,看如下代码:
Integer a = 2;
Integer b = 2;
注意,首先是进行自动装箱的操作,a和b所赋的值一样所以再自动装箱的时候会将a和b指向预先创建好的对象——cache[i] = new Integer(2);。所以a、b此时指向的是同一个对象,所以此时通过符号“==”,a和b是相等的。因为他俩存储的是同一个对象的相关信息。

那么包装类与包装类之间要如何比较呢?

可以利用每一个包装类自身定义的类方法——compare(xxx val1, xxx val2)
对于包装类来说,每一个包装类都定义了其相应的compare(Xxx val1, Xxx val2)类方法;以方便,还可以通过此方法对基本数据类型进行比较。进而可以对属于同类型的包装类变量进行数值之简的比较(自动拆箱)。

从方法定义上看,Integer包装类中的compare方法,声明语句为:
compare(int val1, int val2);
虽然val1和val2是int数据类型,但是不要忘了包装类和相应的基本数据类型之间是可以自动拆箱和自动装箱的,此处如果传递的是Integer类型的变量也是可以进行比较的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值