Java从入门到精通16
包装类
一、什么是包装类
首先我们要知道,Java有两种基本数据类型即基本数据类型、引用数据类型。
然而基本类型以值的形式存在,不是以对象的形式存在,不能直接参与面向对象的方法。所以为解决这一问题,Java推出了包装类。
把基本类型 包装 成 类 的形式,即包装类,就可以面向对象。
因为八大基本类型,所以对应就有八大包装类:
其中Character(char)和 Boolean(boolean) 是Object类的子类,Integer(int),Long(long),Double(double),Short(short),Float(float),Byte(byte)是Number类的子类。
Number类是一个抽象类它继承自Object类,Number类定义了几个抽象方法,要求数字类型的包装类可以将其表示的数字以任意数字类型返回。
注意:
- 包装类是不可变类,在构造了包装类对象后,不允许更改包装在其中的值
- 所以包装类都是final类型,因此不可以创建他们的子类
示例:
package 什么是包装类;
public class Demo {
public static void main(String[] args) {
A a=new A();//A类型引用变量a指向实例化A的地址值
System.out.println(a);
a=new A();//给变量a重新赋实例化A的地址值
System.out.println(a);
//从代码上看a两次均等于new A ();结果应该相等
}
}
final class A{
}
所以,虽然不能更改包装类里面的值,但是可以更改引用 变量的地址值达到更改数据。
二、装箱与拆箱
1、什么是装箱拆箱
装箱:基本数据型变为其对应的包装类对象
拆箱:将包装类中包装的基本数据型取出
2、如何实现
以Integer为例:
- 装箱
- 使用Integer类的构造方法
构造方法:- public Integer(int 变量名/数值) ------------------将int类型转为十进制Integer类型
- public Integer(String 变量名/字符串) -----------将String类型的字符串(由数字组成)转为十进制Integer类型
示例:
package 装箱与拆箱;
//装箱操作
public class Demo1 {
public static void main(String[] args) {
int i=12;
String s="20";
Integer x=new Integer(i);
Integer y=new Integer(s);
System.out.println(x);
System.out.println(y);
}
}
- 使用Integer类内部的valueOf( )方法
内部方法:- public static Integer valueOf(int 变量名/数值)-----------------------输入的数值为int类型,通过valueOf方法转为十进制Integer类型。该方法有一个行参
- public static Integer valueOf(String 变量名/字符串)----------------输入的字符串需为纯数字组成,通过valueOf方法转为十进制Integer类型。该方法有一个行参
- public static Integer valueOf(String 变量名/字符串,int 基数)-----输入的字符串(需为纯数字组成)为基数进制的,通过valueOf方法转为十进制Integer类型。例如(String s,int 2),它的意思是由数字组成的字符串s为二进制数。该方法有两个行参
注意:当int 的数值在-128 ~ 27内时,直接使用常量池,不在-128 ~ 127,都是创建的新对象,这个现象可以在valueOf的底层代码中发现
示例:
package 装箱与拆箱;
public class Demo2 {
public static void main(String[] args) {
int a=20;
String b="22";
System.out.println(Integer.valueOf(a));
System.out.println(Integer.valueOf(b));
System.out.println(Integer.valueOf(b, 4));
}
}
- 自动装箱
系统自动完成装箱操作,也就是自动类型转换
package 装箱与拆箱;
public class Demo3 {
public static void main(String[] args) {
Integer a=10;//此时a是一个对象所以编译器对其进行自动装箱操作
}
}
- 拆箱
- 调用Integer类的intValue()方法
public int intValue()-----------将int类型转为Integer类型
package 装箱与拆箱;
public class Demo4 {
public static void main(String[] args) {
Integer a=129;//此时a为Integer的引用对象,因为129>127
int b=a.intValue();//将Integer类型的变量a转为int类型,并创造一个变量接收返回值
}
}
- 自动装箱
系统自动完成开箱操作,也就是自动类型转换
package 装箱与拆箱;
public class Demo3 {
public static void main(String[] args) {
Integer a=10;//此时a是一个对象所以编译器对其进行自动装箱操作
a=a+10;//因为对象不能参加实数运算,所以编译器对其进行自动开箱操作
}
}
因为Integer(int),Long(long),Double(double),Short(short),Float(float),Byte(byte)是Number类的子类,所以其装箱开箱操作相似。
以Character类为例
- 装箱
- 使用Character类的构造方法
构造方法:
public Character(char 变量名/字符)-------将char类型转为Character类型
package 装箱与拆箱;
public class Demo5 {
public static void main(String[] args) {
Character a = new Character('a');
}
}
- 使用Character类的内部方法装箱
内部方法:
public static Character valueOf(char 变量名/字符)—将char类型转为Character类型
package 装箱与拆箱;
public class Demo6 {
public static void main(String[] args) {
char a='a';
System.out.println(Character.valueOf(a));
System.out.println((int)Character.valueOf(a));
}
}
- 自动装箱
package 装箱与拆箱;
public class Demo7 {
public static void main(String[] args) {
Character x='a';//此时x是一个对象,而‘a’为个字符,所以系统自动为‘a’进行装箱操作
}
}
- 拆箱
- 使用Character类的内部方法拆箱
package 装箱与拆箱;
public class Demo8 {
public static void main(String[] args) {
Character x='a';
char y=x.charValue();
System.out.println(y);
}
}
- 自动拆箱
package 装箱与拆箱;
public class Demo7 {
public static void main(String[] args) {
Character x='a';//此时x是一个对象,而‘a’为个字符,所以系统自动为‘a’进行装箱操作
System.out.println(x+'b');//此时系统自动将x对象转为char类型,a字符对应的ASCII表为
//97,b字符对应的为98,所以输出为195
}
}