1.为什么要有包装类(或封装类)
为了使基本数据类型的变量具有类的特征,引入包装类。
2.基本数据类型与对应的包装类:
3.装箱和拆箱
基本数据类型包装成 包装类的实例—装箱
通过包装类的构造器实现:
int i= 500; Integer t = new Integer(i);
还可以通过字符串参数构造包装类对象:
Float f = new Float(“4.56”);
Long l = new Long(“asdf”); //NumberFormatException 报错 不是一个类型
获得包装类对象中 包装的基本类型变量—拆箱
调用包装类的.xxxValue()方法:
boolean b = Boolean.booleanValue();
JDK1.5之后,支持自动装箱,自动拆箱。但类型必须匹配
public void test3(){
//自动装箱:基本数据类型 --->包装类
int num2 = 10;
Integer in1 = num2;//自动装箱
boolean b1 = true;
Boolean b2 = b1;//自动装箱
//自动拆箱:包装类--->基本数据类型
System.out.println(in1.toString());
int num3 = in1;//自动拆箱
}
字符串转换成 基本数据类型
通过包装类的构造器实现:
int i= new Integer(“12”);
通过包装类的parseXxx(String s)静态方法:
Float f = Float.parseFloat(“12.1”);
包装类在实际开发中用的最多的在于字符串变为基本数据类型。
String str1 = "30" ;
String str2 = "30.3" ;
int x = Integer.parseInt(str1) ;// 将字符串变为int型
float f = Float.parseFloat(str2) ; // 将字符串变为int型
基本数据类型转换成字符串
调用字符串重载的valueOf()方法:
String fstr= String.valueOf(2.34f);
更直接的方式:String intStr = 5 + “”;
面试题:
如下两个题目输出结果相同吗?各是什么
Object o1 = true ? new Integer(1) : new Double(2.0);
System.out.println(o1);//1.0 因为 要使得上述三目运算编译通过 冒号前后的类型要一致,
所以会对int自动类型提升为double --->1.0
(三目运算符中Integer和Double先转为int和double的基本数据类型去做比较)
在 Java 中,当条件表达式的两个分支类型不一致时,会进行类型转换以满足统一的类型要求在这种情况下,会发生数值类型的自动提升。
根据 Java 的数值类型转换规则,Integer 类型可以自动转换为更宽容的数值类型,例如 double。
而 Double 类型本身就是 double 类型的包装类,因此无需进行类型转换。
在这个条件表达式中,由于 new Integer(1) 是 Integer 类型,而 new Double(2.0) 是 Double 类型,
Java 在进行类型转换时会选择更宽容的类型,将整数类型的 1 自动转换为浮点数类型的 1.0。因此,最终的输出结果为 1.0。
如果希望输出结果为整数 1,可以将条件表达式中的 new Double(2.0) 改为整数类型的 2,
即 true ? new Integer(1) : 2。这样,整数类型的 1 将会被赋值给 o1,输出结果就是 1。
public void test3() {
Integer i = new Integer(1);
Integer j = new Integer(1);
System.out.println(i == j);//false 比较地址(new一次生成一个地址)
//Integer内部定义了IntegerCache结构,IntegerCache中定义了Integer[],
//保存了从-128~127范围的整数。如果我们使用自动装箱的方式,给Integer赋值的范围在
//-128~127范围内时,可以直接使用数组中的元素,不用再去new了。目的:提高效率
Integer m = 1;
Integer n = 1;
System.out.println(m == n);//true 没有new新地址 用的是缓存中的1
Integer x = 128;//相当于new了一个Integer对象 因为缓存没有128
Integer y = 128;//相当于又new了一个Integer对象
System.out.println(x == y);//false
}