一、概述
- java并非纯面向对象的语言,这是因为java中的基本数据类型却不是面向对象的。
- 但是我们在实际使用中经常将基本数据类型转换成对象,所以我们用到了包装类。
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
二、对象创建方法
- 与String类似,包装类的对象有两种不同的创建方法。
下面我们以Intenger为例进行,介绍:
Integer i = 3; // “看起来” 符合日常习惯的创建方法(类似基本数据类型的方式创建变量)
Integer i = new Integer(3); // 传参创建方法
第一种创建方法(以类似基本数据类型的方式创建变量):
- 我们可以看到,这两种不同的创建方式,与String类似,当使用第一种方法创建时,会先去常量池(Integer 类型 的 常量池范围为 -128~127,只有这个范围的数组可以进入常量池)查看是否已有等值的变量,已有则不会新创建(所以地址一样,使用 “==” 时才会得到true),否则就在常量池新创建一个变量。(不懂的同学可以看看博主 String类介绍 中,equals下的 < 创建字符串的相关事项 > )
- 此举可以减少同值对象的频繁创建,减少了对内存的占用,适用于无需必须创建新变量的情况。
第二种创建方法(以 "new"关键字 创建对象):
- 这种创建方式一定会在堆区开辟空间创建新的对象,这无关乎其值是否相等。(不懂的同学可以看看博主 String类介绍 中,equals下的 < 创建字符串的相关事项 > )
三、Number抽象类
- Number抽象类是 包装类 Byte、Integer、Double、Float、Short、Long 和 大数类 BigInteger、BigDecimal的父类。
→ 抽象方法xxxValue()
- Number抽象类,除构造方法外,还拥有6个特殊的抽象方法,负责返回相应的值。
- Number的子类,全部都实现了这些方法,这也方便了它们之间的互相转换。
- 这些方法的默认返回值为对应的基本数据类型。
- 我们以Integer的doubleValue方法为例,可以看到,帮我们进行了强制类型转换,十分方便。
这些方法是这六个类都拥有的方法,尽管它们的实现方式不尽相同,其功能是为了方便类型间相互转换。
另外Character、Boolean也有类似的方法:charValue()、booleanValue(),可获取其对应基本类型的值,但它们并不拥有上面的六个实现方法,反之亦然。
四、同名方法
顾名思义,共有方法就是这些包装类都拥有的方法,尽管它们的实现方式不尽相同,
① equals
- 包装类重写了equals方法,它们的用法与String类似,可以比较两个值是否相等。
- 避免了使用 运算符 “==” 时,只比较被引用对象地址的尴尬局面(两种创建方式的区别得以体现)。
这里,我么依旧以Integer为例:
//以类似基本数据类型的方式创建变量
Integer i1 = 1;
Integer i2 = 1;
//第一种创建方式自身
System.out.println("第一种创建方式自身,使用 == :" + (i1==i1));
System.out.println("第一种创建方式自身,使用equals:" + i1.equals(i1));
System.out.println("-----------------------------------------------------");
//第一种创建方式之间
System.out.println("第一种创建方式之间,使用 == :" + (i1==i2));
System.out.println("第一种创建方式之间,使用equals:" + i1.equals(i2));
System.out.println("-----------------------------------------------------");
//以"new"关键字创建对象
Integer i3 = new Integer(1);
Integer i4 = new Integer(1);
//第二种创建方式自身
System.out.println("第二种创建方式自身,使用 == :" + (i3==i3));
System.out.println("第二种创建方式自身,使用equals:" + i3.equals(i3));
System.out.println("-----------------------------------------------------");
//第二种创建方式之间
System.out.println("第二种创建方式之间,使用 == :" + (i3==i4));
System.out.println("第二种创建方式之间,使用equals:" + i3.equals(i4));
System.out.println("-----------------------------------------------------");
//第一种创建方式 与 第二种创建方式
System.out.println("第一种创建方式 与 第二种创建方式,使用 == :" + (i1==i3));
System.out.println("第一种创建方式 与 第二种创建方式,使用equals:" + i1.equals(i3));
运行结果如下:
通过运行结果,我们可以很明确的分析出两种创建方式的本质区别。
② compareTo
- 与String比较整体所有字符差值的和类似,若对应基本数据类型为整数类型,它返回调用者与参数相比的差值;若对应基本数据类型为其他类型(包括浮点型),调用者大返回1,相等返回0,否则放回-1;
- 我们分别以Integer、Character、Doube、Boolean为例:
1、比较Integer对象(返回差值):
//比较Integer对象的差值(i1与i2相比)
Integer i1 = 3;
Integer i2 = 4;
System.out.println("比较Integer对象的差值(i1与i2相比):" + i1.compareTo(i2));
运行结果如下:
2、比较Character对象(返回差值):
//比较Character对象的差值(c1与c2相比)
Character c1 = 'a';
Character c2 = 'z';
System.out.println("比较Character对象的差值(c1与c2相比):" + c1.compareTo(c2));
运行结果如下:
3、比较Double对象(返回 “大小值” ):
//比较Double对象
Double d1 = 1.25;
Double d11 = 1.25;
Double d2 = 10000.26;
System.out.println("比较Double对象的大小(d1与d2相比):" + d1.compareTo(d2));
System.out.println("比较Double对象的大小(d1与d11相比):" + d1.compareTo(d11));
运行结果如下:
4、比较Boolean对象(返回 “大小值” ):
//比较Boolean对象的大小
Boolean b1 = true;
Boolean b11 = true;
Boolean b2 = false;
System.out.println("比较Boolean对象的大小:" + b1.compareTo(b2));
System.out.println("比较Boolean对象的大小:" + b1.compareTo(b11));
- 无论是返回差值、大小值,我们都可以通过 if、while (条件判断)语句 结合">" “>=” “<” “<=” "=="与 0 比较,来确定两方的大小。
//比较Double对象的大小
Double d1 = 1.25;
Double d2 = 10000.26;
if(d1.compareTo(d2) > 0){
System.out.println("d1大于d2");
}else if(d1.compareTo(d2) == 0){
System.out.println("d1等于d2");
}else{
System.out.println("d1小于d2");
}
运行结果如下:
③ xxxValue
- 该方法方便了数字类型间的类型转换,也方便所有类型获取对应基本数据类型的值。
返回值基本数据类型 | 对应方法 |
---|---|
int | intValue() |
double | doubleValue() |
float | floatValue() |
byte | byteValue() |
short | shortValue() |
long | longValue() |
char | charValue() |
boolean | booleanValue() |
具体使用如下:
//Integer
Integer i = 3;
System.out.println("Integer --> intValue : " + i.intValue());
System.out.println("Integer --> doubleValue : " + i.doubleValue());
//Character
Character c = 'z';
System.out.println("Character --> charValue : " + c.charValue());
//Double
Double d = 3.14;
System.out.println("Double --> doubleValue : " + d.doubleValue());
System.out.println("Double --> intValue : " + d.intValue());
运行结果如下: