包装类
包装类的理解
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;}@Overridepublic 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"(四个字母均不区分大小写),都会被当做falseBoolean bb4 = new Boolean("False"); //falseBoolean bb5 = new Boolean("Flase"); //falseBoolean bb6 = new Boolean("12"); //falseBoolean bb7 = new Boolean("12.3f"); //falseBoolean bb8 = new Boolean("true"); //trueBoolean bb9 = new Boolean("TrUe"); //true}
}
调用包装类的valueOf( )
public class WrapperTest{public static void main(String []args){Integer ii1 = Integer.valueOf(12); //12Integer ii2 = Integer.valueOf("12"); //12Boolean bb1 = Boolean.valueOf(true); //trueBoolean 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); //12Float ff1 = Float.valueOf(12.3f);float f1 = ff1.floatValue();System.out.println(f1); //12.fBoolean 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); //falseSystem.out.println(a.b2); //nullSystem.out.println(a.d1); //0.0System.out.println(a.d2); //null}
}
自动装箱、自动拆箱
jdk5.0后,新特性:自动装箱、自动拆箱
public class AutoWrapperTest{public static void main(String []args){ //自动装箱Integer ii1 = 10;System.out.println(ii1); //10Boolean bb1 = false;System.out.println(bb1); //false//自动拆箱int i1 = ii1;System.out.println(i1) //10boolean b1 = bb1; System.out.println(b1); //false}
}