包装类
1:什么是包装类
包装类的主要功能是针对于基本数据类型的对象转换而实现的。
Object类的最大特点是所有类的父类,并且可以接收所有的数据类型,但是在这个过程中存在有个问题:基本数据类型并不是一个类,所以现在如果要想将基本数据类型以类的形式进行处理,那么就需要对其进行包装。
//范例:以int数据为例实现一个包装处理的定义
class Int {
private int data ; // 包装了一个基本数据类型
public Int(int data) {
this.data = data ;
}
public int intValue() {
return this.data ;
}
}
public class JavaDemo {
public static void main(String args[]) {
Object obj = new Int(10) ; // 装箱:将基本数据类型保存在包装类之中
int x = ((Int)obj).intValue() ; // 拆箱:从包装类对象中获取基本数据类型
System.out.println(x * 2) ;
}
}
基本数据类型进行包装处理后可以像对象一样进行引用传递,同时也可以使用Object类来进行接收;
JDK1.0提供了包装类;
基本数据类型有8种,所以提供有8种包装类:
可以发现在Java种包装类一共提供有两种类型:
1:对象包装类(Object直接子类):Boolean,Character;
2:数值型的包装类(Number直接子类):Byte,Short,Integer,Long,Float,Double;
Number 是一个抽象类,以后只要是看到Number,明确的表示它是一个数字的概念,这个类定义有如下方法:
Number类中的方法就是直接提供有获取包装类中基本数据类型的功能,一共只定义有六个方法。
2:装箱和拆箱操作
基本数据类型的包装类都是为了基本数据类型转为对象提供的,基本类型和包装类有如下操作关系:
A:数据装箱:将基本数据类型保存到包装类之中(利用构造方法完成):
如:Integer类:public Integer(int value);
B:数据拆箱:从包装类中获取基本数据类型:
数值型包装类由Number类定义了拆箱的方法;
//案例1:int和Integer
public class JavaDemo {
public static void main(String args[]) {
Integer obj = new Integer(10) ; // 装箱
int num = obj.intValue() ; // 拆箱
System.out.println(num * num) ;
}
}
//案例2:boolean和Boolean
public class Demo{
public static void main(String args[]){
Boolean obj = new Boolean(true);//装箱
boolean num = obj.booleanValue();//拆箱
System.out.println(num);
}
}
从JDK1.9之后,对于所有的包装类之中提供的构造方法变成了过期处理,不建议用户继续使用,因为从JDK1.5之后为了方便处理提供了自动的装箱和拆箱操作,所以这种人工的模式基本没有人用了。
//观察自动装箱和拆箱
public class JavaDemo {
public static void main(String args[]) {
Integer obj = 10 ; // 自动装箱,此时不再关心构造方法了
int num = obj ; // 自动拆箱
obj ++ ; // 包装类对象可以直接参与数学运算
System.out.println(num * obj) ; // 直接参与数学运算
}
}
除了上上述代码中提供由自动的数学运算支持外,使用自动装箱最大的好处是可以实现Object接收基本数据类型的操作(代码如下)。
public class JavaDemo {
public static void main(String args[]) {
Object obj = 19.2 ; // double自动装箱为Double,向上转型为Object
double num = (Double) obj ; // 向下转型为包装类,再自动拆箱
System.out.println(num * 2) ;
}
}
JDK1.5之后提供了自动支持功能,到了JDK1.9之后为了巩固此概念,所以将包装类的构造方法都设置为过期定义了(如下图)。
3:关于包装类相等判断
public class Test {
public static void main(String args[]) {
Integer x = 200 ;
Integer y = 200 ;
Integer M= 99 ;
Integer N = 99 ;
System.out.println(M == N) ; // true
System.out.println(x == y) ; // false
System.out.println(x.equals(y)) ; // true
}
}
以后进行包装类相等的判断的时候一定要使用equals()完成,而包装类本身也需要考虑占位的长度,如果超过了一位的内容,就需要用equals()比较,如果不超过则使用“==”即可判断。
4:数据类型的转换
A:字符串数据变为基本数据类型
使用包装类还有一个最大的特点在于可以实现字符串于基本数据类型之间的转换;
在日后的开发中,用户可以输入的数据类型只有一种:字符串,那么对于程序就需要根据接收的字符串将其变成基本的数据类型:
Integer类:public static int parseInt(String s);
Double类:public static double parseDouble(String s);
Boolean类:public static boolean parseBoolean(String s);
public class JavaDemo {
public static void main(String args[]) {
String str = "123" ; // 字符串由数字所组成
int num = Integer.parseInt(str) ; // 字符串转为int
System.out.println(num * num) ;
}
}
//注意哦:此时的字符串必须全部由数组组成,如果不是这样,执行时会“NomberFormatException”异常信息。
//转换boolean
public class JavaDemo {
public static void main(String args[]) {
String str = "abc" ; // 字符串由数字所组成
boolean flag = Boolean.parseBoolean(str) ;
System.out.println(flag) ;
}
}
//boolean取值范围只有:true和false,如果说现在字符串的输入内容不是true或者false,统一按照false来进行处理。
B:基本数据类型变为字符串
做法1:任意的基本数据类型于字符串连接后自动变为String型。(这种方法会产生无用垃圾)
public class JavaDemo {
public static void main(String args[]) {
int num = 100 ;
String str = num + "" ;// 字符串连接
System.out.println(str.length()) ; // 计算长度3
}
}
做法2:String类中提供由一系列valueOf()的方法转换。
public class JavaDemo {
public static void main(String args[]) {
int num = 100 ;
String str = String.valueOf(num) ;// 字符串转换
System.out.println(str.length()) ; // 计算长度
}
}
//利用此方式可以避免一些垃圾的产生