包装类
包装类的理解
Java提供了两个类型系统,基本数据类型
和引用数据类型
,但是在一些场景中,我们需要使用基本数据类型像对象那样使用。而包装类提供了这种行径
为什么要使用包装类
为了使得基本数据类型的变量具备引用数据类型变量的相关特征。例如,封装性、继承性、多态性。 给各个基本数据类型的变量都提供了对应的包装类。这时候Java才能叫做真正的面向对象
Java针对于八中基本数据类型定义了相应的引用数据类型:包装类(封装类)
特殊注意,只有int
和char
使用了英文全称,其他的都是首字母变为大写
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
boolean | Boolean |
char | Character |
内存结构的变化
相较于基本数据类型只存在于栈空间当中,包装类和对象相同,在堆空间中存放数值,在栈空间中存放地址
public static void main(String []args){
int num = 1; //存在于栈空间当中
Integer obj = new Integer(1); //数值存在于堆空间,地址存在于栈空间中
}
自定义包装类
public class MyInteger{
int value;
public MyInteger(){
}
public MyInteger(int value){
this.value = value;
}
@Override
public String toString(){
return String.valueOf(value);
}
}
基本数据类型与包装类之间的转换
为什么需要转换
- 对于基本数据类型来讲,在有些场景下,需要使用基本数据类型对应的包装类的对象。此时就需要讲基本数据类型的变量转换为包装类的对象。
例如,ArrayList的add(Object obj);Object类的equals(Object obj)
- 对于包装类来讲,使用的是对象,但对象不能进行 + - \ * 的运算,为了能够进行这些运算,就需要将包装类对象转换为基本数据类型。
怎样转换
- jkd5.0之前,使用构造器、方法进行转换
- jdk5.0及以后,存在自动装箱、自动拆箱,提高代码编译速度
基本数据类型 ——> 包装类(装箱)
使用包装类的构造器(@Deprecated)
正常转换
class WrapperTest{
public static void main(String []args){
//使用构造器进行转换
int i1 = 10;
Integer ii1 = new Integer(i1);
System.out.println(ii1);
float f1 = 12.3f;
Float ff1 = new Float(f1);
System.out.println(ff1);
boolean b1 = true;
Boolean bb1 = new Boolean(b1);
System.out.println(bb1);
}
}
//输出结果:
//10
//12.3
//true
使用String进行转换
几种包装类的构造器
//Integer public Integer(String s) throws NumberFormatException { this.value = parseInt(s, 10); } public Integer(int value) { this.value = value; } //Float public Float(float value) { this.value = value; } public Float(double value) { this.value = (float)value; } public Float(String s) throws NumberFormatException { value = parseFloat(s); } //构造器中都有含String的构造器.所以可以通过String类型数据进行声明
使用方法
class WrapperTest{
public static void main(String []args){
Float ff1 = new Float("12.3f");
Integer ii1 = new Integer("12");
}
}
Boolean的声明
Boolean的构造器
@Deprecated(since="9", forRemoval = true) public Boolean(boolean value) { this.value = value; } @Deprecated(since="9", forRemoval = true) public Boolean(String s) { this(parseBoolean(s)); } public static boolean parseBoolean(String s) { return "true".equalsIgnoreCase(s); //equalsIgnoreCase() 忽视大小写的比较 } //其中,形参是String活boolean value //所以,形参为字符串和布尔类型都可以
class WrapperTest{
public static void main(String []args){
//当形参为boolean value时
Boolean bb1 = new Boolean(true);
Boolean bb2 = new Boolean(false);
//当形参为String时
Boolean bb3 = new Boolean("false");
//特殊的,当形参为String时,若字符串所存内容不是"true"(四个字母均不区分大小写),都会被当做false
Boolean bb4 = new Boolean("False"); //false
Boolean bb5 = new Boolean("Flase"); //false
Boolean bb6 = new Boolean("12"); //false
Boolean bb7 = new Boolean("12.3f"); //false
Boolean bb8 = new Boolean("true"); //true
Boolean bb9 = new Boolean("TrUe"); //true
}
}
调用包装类的valueOf( )
public class WrapperTest{
public static void main(String []args){
Integer ii1 = Integer.valueOf(12); //12
Integer ii2 = Integer.valueOf("12"); //12
Boolean bb1 = Boolean.valueOf(true); //true
Boolean bb2 = Boolean.valueOf("tRuE"); //true
}
}
包装类 ——>基本数据类型(拆箱)
调用包装类的XxxValue()方法,返回一个基本数据类型
public class WrapperTest {
public static void main(String[] args) {
Integer ii1 = Integer.valueOf(12);
int i1 = ii1.intValue();
System.out.println(i1); //12
Float ff1 = Float.valueOf(12.3f);
float f1 = ff1.floatValue();
System.out.println(f1); //12.f
Boolean bb1 = Boolean.valueOf(false);
boolean b1 = bb1.booleanValue();
System.out.println(b1); //false
}
}
默认值的区别
原来使用基本数据类型变量的位置,改成包装类以后,对于成员变量来说,其默认值变化了
class Account{
boolean b1;
Boolean b2;
double d1;
Double d2;
}
public class AccountTest{
public static void main(String []args){
Account a = new Account();
System.out.println(a.b1); //false
System.out.println(a.b2); //null
System.out.println(a.d1); //0.0
System.out.println(a.d2); //null
}
}
自动装箱、自动拆箱
jdk5.0后,新特性:自动装箱、自动拆箱
public class AutoWrapperTest{
public static void main(String []args){
//自动装箱
Integer ii1 = 10;
System.out.println(ii1); //10
Boolean bb1 = false;
System.out.println(bb1); //false
//自动拆箱
int i1 = ii1;
System.out.println(i1) //10
boolean b1 = bb1;
System.out.println(b1); //false
}
}