Java的数据类型:
其中,基本数据类型是没有属性、方法的,也无法对象化交互。
包装类的产生就是为了解决这样的问题。
通过包装类,可以使基本数据类型拥有属性、方法,可以对象化交互。
https://docs.oracle.com/javase/8/docs/api/
我们以Integer为例,查看文档,了解其常用的属性和方法:
我们可以看到,Java中包装类都用final
修饰,都是不允许继承,也没有子类的。
且,Integer
是继承自Number
类的——实际上,所有数值型都是继承自Number
类的。
而char的包装类Character,boolean的包装类Boolean,都是继承自Object的。
装箱:把基本数据类型的值转换为相应包装类的对象。
拆箱:把包装类的对象转换为对应基本数据类型的值。
装箱代码:装箱分为自动装箱和手动装箱。
public class WrapTest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 装箱:把基本数据类型转换为包装类
// 1、自动装箱
int t1 = 2;
Integer t2 = t1;
// 2、手动装箱
Integer t3 = new Integer(t1);
// 测试
System.out.println(t1);
System.out.println(t2);
System.out.println(t3);
}
}
输出:
2
2
2
拆箱代码:有自动拆箱和手动拆箱两种。
public class WrapTest1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// 装箱:把基本数据类型转换为包装类
// 1、自动装箱
int t1 = 2;
Integer t2 = t1;
// 2、手动装箱
Integer t3 = new Integer(t1);
// 拆箱:把包装类转换为基本数据类型
// 1、自动拆箱
int t4 = t2;
// 2、手动拆箱
int t5 = t2.intValue();
// 测试
System.out.println(t4);
System.out.println(t5);
}
}
输出:
2
2
也可以这样转换:
double t = t2.doubleValue();
System.out.println(t);
输出:2.0
基本数据类型转换为字符串:
public static void main(String[] args) {
// 基本数据类型转换为字符串
int t1 = 2;
String t2 = Integer.toString(t1);
System.out.println(t2);
}
输出:2
字符串转换为基本数据类型:
方法1:包装类的parse
方法
public static void main(String[] args) {
// 基本数据类型转换为字符串
int t1 = 2;
String t2 = Integer.toString(t1);
int t3 = Integer.parseInt(t2);
System.out.println(t3);
}
输出:2
方法2:包装类的valueOf
方法。
public static void main(String[] args) {
// 基本数据类型转换为字符串
int t1 = 2;
String t2 = Integer.toString(t1);
int t3 = Integer.valueOf(t2);
System.out.println(t3);
}
输出:2
false
true
true
true
false
为什么one==two
是false
:
因为one和two指向的是两个不同的空间,只是他们的值都是100而已。因此,他们不相等。
public static void main(String[] args) {
Integer one=new Integer(100);
Integer two=new Integer(100);
System.out.println(one);
System.out.println(two);
}
输出:false
为什么three==100
是true
:它其实完成了自动拆箱的操作,所以是true。
Integer three=100;
System.out.println(three==100);
输出:false
为什么three==four
是true
:
Integer three = 100;
Integer four = 100;
System.out.println(three == four);
输出:true
原因:Integer four=100
其实执行的是Integer four=Integer.valueOf(100);
为了提高运行效率,Java有一个常量数组的缓存区(对象池),当 -128<=数值<=127 时,Java会直接在对象池里找这样一个常数,如果有这样的常数,对象会直接指向这块内存;如果没有,再实例化Integer。
因此,上面的代码中three和four指向的是同一块空间。
显然,我们有:
Integer three = 128;
Integer four = 128;
System.out.println(three == four);
是false
;
除了float
和double
,其他的都可以用对象常量池。
也就是说:
Double d1 = Double.valueOf(100);
Double d2 = Double.valueOf(100);
System.out.println(d1 == d2);
输出false
在Java中,我们可以通过包装类解决基本数据类型的不具有对象化的能力的问题。
每一种基本数据类型都有它对应的包装类:
Java中所有的包装类都是存在Java.lang中的。
我们可以通过装箱和拆箱的操作来实现包装类和基本数据类型的转换。
我们也可以用包装类来完成基本数据类型和字符串之间的转换。