包装类
包装类的概念:
针对八种基本数据类型定义的相应的引用类型------就称之为包装类(封装类)
为什么要引入包装类(重点)?
为了基本数据类型也归到面向对象当中(也就是将基本数据类型包装到类中)
八种基本数据分别对应的包装类:
byte short int long float double char boolean
Byte SHort Integer Long Float Double Character Boolean
- 这里面只有int型和char型对应的包装类的单词拼写发生了变化,其他的基本数据类型对应的包装类都只是大写首字母罢了
注意:这八种基本数据类型的前六种都共有一个直接父类Number,然后Number类再继承自Object类
包装类就好比是圣斗士星矢穿上了圣衣,变厉害了(从基本数据类型转变成了引用类型,转变成了一个个一一对应的类)
- 其实也就是基本数据类型穿上了衣服变成了包装类
包装类的作用(也就是我们需要掌握的):
java提供了八种基本数据类型对应的包装类,使得基本数据类型的变量具有类的特征
基本数据类型与String还有与包装类的相互转换.
基本数据类型-------->包装类
- 调用对应包装类的构造器
Integer in1=new Integer(10);//编译正确
Integer in2=new Integer("10");//编译正确
Integer in3=new Integer("123abc");//编译正确,运行时会发生数据格式转换异常
Float f1=new Float(12.3f);//编译正确
Float f2=new Float("12.3");//编译正确,默认在12.3后面加f表示是单精度实数
Float f3=new Float(12);//编译正确,这里会默认在12后面加f表示是单精度实数
这里布尔型的基本类型装换包装类在这里做了一个优化(sun公司做的)
优化:布尔性的基本类型装包装类是只要传入的字符串时传入true就返回true(这里忽略了大小写(也就是不管是大写的true还是小写的true,还是混合大小写的true,只要是true,不管大小写都返回true)),只要不是true就返回false但是传入的是boolean型变量时只能是true或者false,并且只能是小写
Boolean b1=new Boolean(true);//编译正确 返回true
Boolean b2=new Boolean("TRue");//编译正确 返回true
Boolean b3=new Boolean("true123");//编译正确 返回false
class Order{
boolean isMale;
boolean isFemale;
}
class A{
Order Or=new Order();
System.out.println(Or.isMale);//这里输出的结果为false
System.out.printlnl(Or.isFemale);//这里输出的结果为null
}
包装类----------->基本数据类型
调用包装类的xxxValue();
- 上面的xxx为基本数据类型
eg:
Integer in1=new Integer(12);
int i1=in1.intValue();
System.out.println(i1);
jdk5.0之后的新特性
自动装箱与自动拆箱
自动装箱
自动装箱:java编译器自动将基本数据类型转变为包装类的功能我们就称之为自动装箱
注意:这里有一个特殊点(只针对于Integer):
特殊点(可能面试题会出)(只关于Integer包装类):
由于我们经常会将-128-127之间的数进行包装成类,所以我们就在Integer的内部定义了一个IntegerCache结构,IntegerCache中定义了Integer [] 数组在这个数组中保存了-128-127范围之间的整数,如果我们使用自动装箱的方式给Integer赋值-128-127范围内时,可以直接使用数组中的元素,不用再去new了,目的是为了提高效率
(这里因为-128-127之间的在编程中比较常用)
int num2=10;
Integer in1=num2;
这里原本应该为:Integer in1=new Integer(num2);
- 但是在jdk5.0之后我们增加了自动装箱与自动拆箱的功能,上面就是自动装箱的功能
自动拆箱
自动拆箱:Java编译器自动将包装类转变为基本数据类型的功能我们就称之为自动拆箱
Integer in1=10;//这里是自动装箱
int num=in1;//这里就是自动拆箱
- 在jdk5.0之前装箱要调用包装类的构造方法
- 在jdk5.0之前拆箱要调用包装类的xxxValue()方法
由于基本数据类型和包装类之间可以自动装箱和自动拆箱所以我们一般将基本数据类型和包装类视为一体,探讨包装类和基本数据类型向String(字符串)的转换
基本数据类型,包装类-------->String(字符串)
方式一:连接运算
eg:
int num1=10;
String str1=num1+"";
这里字符串与任何基本数据类型之间连接之后都会变成String(字符串)类型
方式二:调用String的valueOf(Xxx xxx)
eg:
float f1=12.3f;
String str2=String.valueOf(f1);//这里调用的String.valueOf()方法的形参为(float f)
Double d1=new Double(12.4);
String str3=String.valueOf(d1);//这里调用的String.valueOf()方法的形参为(Object obj)
String(字符串)--------->基本数据类型,包装类
字符串转变为基本数据类型(或者包装类)的转换方式很重要,需要记住
方式:调用包装类的parseXxx(String s)方法
eg:
String str="123";
int num2=Integer.parseInt(Str);
System.out.println(num2);//这里的输出结果为整形基本类型123
String str2="true1"; //这里输入的字符串Str2字符串的为false(因为这里字符串的输入的true不一样(但 //是要注意:这里不区分大小写))
boolean b1=Boolean.parseBoolean(str2);
System.out.println(b1); //这里输出的结果为false
基本数据类型 ------> 包装类
通过调用包装类构造方法
包装类 --------> 基本数据类型
通过调用包装类的方法: xxxValue() eg:对象名.intValue()
基本数据类型,包装类 -------------> String(字符串)
- 拼接
- 调用String类的valueOf()方法
- 这个方法是一个静态方法,可以通过类名直接调用,也就是通过String.直接调用
(重点)String --------------> 基本数据类型,包装类
- 调用相应包装类的parseXxx(String s)方法
- 这个方法也是一个静态方法,可以通过相应的包装类名直接调用
- 调用包装类的构造方法
面试题案例
Object 0bj1=true? new Integer(1) : new Double(2.0);
System.out.println(obj1);
那么这里的输出结果为什么?
这里的输出结果为1.0
- 因为三目运算符对:(冒号)左右的数据有要求,要求两边的数据要保持一致,如果不一致就要进行默认转换转变为大容量的数据类型
那么对于这道题而言,这里冒号(:)两边的数据一个为Int类型的,一个为double类型的,这个时候就会默认转换为double类型,所以最终输出的结果为1.0
Integer i=new Integer(1);
Integer j=new Integer(1);
System.out.println(i==j); //这里的输出结果为false
Integer m=1;
Integer n=1;
System.out.println(m==n);//这里的输出结果为true
Integer x=128;
Integer y=128;
System.out.println(x==y); //这里的输出结果为false
具体愿意参照上面的Integer包装类的特例
这里的第二个是没有使用new调用构造方法,这里自动装箱是通过类似于常量池的东西中找到1然后复制过来,所以这两个1都是一个常量池中的同一位置找到的,所以这个时候地址相同,那么==判断的结果就为true
- 但是这个常量池只有-128—127之间的256个数,没有128,所以128只能是通过new关键字调用构造方法产生的,所以这个时候两个对象的地址不相同,输出结果也就为false