包装类
Object类可以接收所有的引用数据类型,但是我们都知道,在Java中,数据类型分为基本数据类型和引用数据类型,那么基本数据类型应该如何处理?这就引入了包装类,也就是指,将基本数据类型封装到类中。看一个简单的包装类,int数据类型的包装类,利用intvalue就可以实现基本数据类型变为对象的需求。看代码:
//int数据类型的包装类
class Int{
private int num;
public Int(int num){
this.num = num;
}
public int intvalue(){
return this.num;
}
}
public class Package{
public static void main(String[] args){
//子类向上转型
Object obj = new Int(10);
//向下转型,强转
Int tmp = (Int)obj;
//取出里面的基本数据类型操作
System.out.println(tmp.intvalue());
}
}
D:\MySQL5.7\javawork>java Package
10
结论
将基本数据类型包装为一个类对象的本质就是使用Object进行接收处理。所以为了方便开发,专门提供了包装类的使用,而对于包装类的使用,提供了两种类型:
(1)对象型(Object的直接子类)Boolean, Character(char);
(2)数值型(Number的直接子类)Byte, Double, Short, Long, Integer(int), Float;
Number类:public, abstract, class, Number, implements, java.io.Serializable.
装箱与拆箱
(1)装箱:将基本数据类型变为包装类,利用每一个包装类提供的构造方法实现装箱处理;
(2)拆箱:将包装类中包装的基本数据类型取出,利用Number类中的六种方法。
(3)手工装箱拆箱
//装箱
Integer num = new Integer(10);
//拆箱
int data = num.intvalue();
System.out.println(data);
(4)自动装箱拆箱
//自动装箱
Integer x = 10;
//直接利用包装类对象操作
System.out.println(++x*5);
(5)注意问题,看代码:
public class Package{
public static void main(String[] args){
//-128
Integer a = Integer.valueOf(-128);
Integer b = Integer.valueOf(-128);
//127
Integer c = Integer.valueOf(127);
Integer d = Integer.valueOf(127);
//-129
Integer e = Integer.valueOf(-129);
Integer f = Integer.valueOf(-129);
//128
Integer j = Integer.valueOf(128);
Integer k = Integer.valueOf(128);
System.out.println(a == b);//true
System.out.println(a.equals(b));//true
System.out.println(c == d);//true
System.out.println(c.equals(d));//true
System.out.println(e == f);//false
System.out.println(e.equals(f));//true
System.out.println(j == k);//false
System.out.println(j.equals(k));//true
}
}
D:\MySQL5.7\javawork>java Package
true
true
true
true
false
true
false
true
可以看到,结果与预期还是有些差距的。为什么会导致这样的结果呢?通过这个边界测试,可以知道,在[-128,127]这个区间内的Integer值可以直接用==进行判断,但是在这个区间之外的所有数据,结果就不一样了。因为在[-128,127]范围内,Integer对象是在IntegerCache.cache产生,会复用已有对象,在这个区间之外的数据,都会在堆上产生,并且不会复用已有对象,所以要注意这个“大坑”,以后还是尽量使用equals()方法进行判断。
字符串与基本数据类型转换
(1)将字符串变为int型
public class Package{
public static void main(String[] args){
String str = "123";
int num = Integer.parseInt(str);
System.out.println(num);
}
}
D:\MySQL5.7\javawork>java Package
123
(2)将字符串变为double型
public class Package{
public static void main(String[] args){
//纯数字
String str = "123";
//非纯数字
String str1 = "123abc";
double num = Double.parseDouble(str);
double num1 = Double.parseDouble(str1);
System.out.println(num);
System.out.println(num1);
}
}
D:\MySQL5.7\javawork>java Package
Exception in thread "main" java.lang.NumberFormatException: For input string: "123abc"
at sun.misc.
在这里出错了,原因就在于字符串的组成有非数字,所以转换出现了问题,但是纯数字不影响。
(3)将字符串变为boolean型
public class Package{
public static void main(String[] args){
//纯数字
String str = "123";
//非纯数字
String str1 = "123abc";
boolean num = Boolean.parseBoolean(str);
boolean num1 = Boolean.parseBoolean(str1);
boolean num2 = Boolean.parseBoolean("TRUE");
System.out.println(num);
System.out.println(num1);
System.out.println(num2);
}
}
D:\MySQL5.7\javawork>java Package
false
false
true
所以这里可以看到,字符串与boolean类型转换就不会受任何的影响,并且与"true, false"大小写无关,不论大小写,都可以得到正确的结果。
(4)基本数据类型转字符串
任何数据类型使用了"+"连接空白字符串就变成了字符串类型;使用String类中提供的valueOf()方法,不会产生垃圾。
public class Package{
public static void main(String[] args){
String str = String.valueOf(10);
System.out.println(str);
}
}
D:\MySQL5.7\javawork>java Package
10
本文深入解析Java中的包装类,包括其定义、使用场景、装箱与拆箱过程,以及字符串与基本数据类型之间的转换方法。文章还探讨了包装类在特定数值范围内的对象复用机制,提醒开发者注意在进行对象比较时可能遇到的陷阱。
5748

被折叠的 条评论
为什么被折叠?



