首页 > 编程笔记

Java包装类用法详解

在 Java 通常使用的一般数据类型又称为值类型。这种数据类型存储在栈中,不属于对象的范畴。

Java 是面向对象的程序设计语言,基本数据类型不是面向对象的形式,所以不符合面向对象程序设计的基本思想。但基本数据类型易于理解,能够简化程序的编写,所以有其存在的合理性。

实际开发中,有时需要使用以对象形式表示的数据类型,这就需要为每种基本数据类型提供对应的类,将原始类型转换为对象类型。

所谓包装类,就是把值类型的变量进行包装,采用对象的方式对其进行操作,使其有自己的属性和方法。把值类型的数据包装成引用类型的过程又称为装箱,其逆过程称为拆箱。

Java SE 1.5 提供了自动装箱和自动拆箱功能,可以将原始类型自动转换为对象类型,以及将对象类型自动转换为原始类型。

Java的包装类

java.lang 包内的 8 个类在 Java 中称为包装类。基本数据类型对应的包装类如下表所示。


表 1 基本数据类型对应的包装类
基本数据类型 包装类
int Integer
float Float
char Character
double Double
boolean Boolean
byte Byte
long Long
short Short

在这 8 个类中,除了 Integer 和 Character,其他 6 个类的类名和基本数据类型一致,只是类名的第一个字母使用大写形式而已。

【实例】包装类的基本应用。
public class Demo {
    public static void main(String[] args) {
        Integer i = new Integer(10); // 括号中应该是数字10,而不是字符l0
        Character c = new Character('a'); // 正确使用单引号定义字符

        System.out.println(i); // 打印Integer对象的值
        System.out.println(c); // 打印Character对象的值
    }
}
运行结果为:

10
a

包装类和基本数据类型的区别

1) 默认值不同

包装类的默认值是 null,而基本数据类型采用对应的默认值(如整型的默认值是 0,浮点类型的默认值是 0.0)。

在现实开发中,包装类的默认值 null 可以有效标记该变量是否被初始化,而基本数据类型想要实现相同效果则更复杂。例如,在表示温度的成员变量中,如果使用 Double 类型,则默认值 null 表示数据没有初始化。如果使用 double 类型,那么默认值 0.0 容易产生歧义,无法分辨是未初始化,还是温度刚好为 0℃。

2) 存储区域不同

基本数据类型把值保存在栈内存中;包装类把对象保存在堆中,并通过对象的引用来调用这些对象。

Java自动装箱

将基本数据类型转换为包装类称为装箱。将原始数据类型自动转换为其对应的包装类的操作称为自动装箱。

从 Java 5 开始,不再需要使用包装器类的 valueOf() 方法将原始数据类型转换为对象。

【实例】Java自动装箱的应用。
public class Demo {
    public static void main(String[] args) {
        // 将int型转换为Integer
        int a = 20;
       
        // 手动转换,将int型显式转换为Integer
        Integer i = Integer.valueOf(a);
       
        // 自动装箱,编译器将在内部调用Integer.valueOf(a)方法
        Integer j = a;
       
        // 打印原始int类型和两个Integer对象
        System.out.println(a + "" + i + "" + j);
    }
}
运行结果为:

20 20 20

4.Java自动拆箱

将包装类转换为基本数据类型称为拆箱。将包装类自动转换为其对应的原始类型的操作称为自动拆箱,这是自动装箱的逆向过程。

从 Java 5 开始,不再需要使用包装类的方法将包装类转换为原始类型。

【实例】Java 自动拆箱的应用。
public class Demo {
    public static void main(String[] args) {
        // 将Integer转换为int型
        Integer a = new Integer(3);
       
        // 手动转换,将Integer明确转换为int型
        int i = a.intValue();
       
        // 自动拆箱,编译器将在内部调用a.intValue()方法
        int j = a;
       
        // 打印Integer对象和两个int变量
        System.out.println(a + " " + i + " " + j);
    }
}
运行结果为:

3 3 3

Java包装类的方法

除了数据封装,包装类还提供了一些与相应数据类型相关的操作方法。下面以 Integer 类为例展开介绍:
除了方法,包装类还提供了一些比较常用的静态常量,下面以 Integer 类为例展开介绍:
【实例】Integer 类中的方法的应用。
public class Demo {
    public static void main(String[] args) {
        // 将字符串转换为int型
        String str = "123"; // 变量名应使用合适的命名规则
        int num = Integer.parseInt(str);
        System.out.println("num = " + num);

        // 将数值转换为八进制形式
        String octal = Integer.toOctalString(128);
        System.out.println("128 to Octal = " + octal);

        // 将数值转换为十六进制形式
        String hex = Integer.toHexString(128); // 方法名应为toHexString
        System.out.println("128 to hex = " + hex);

        // 比较大小
        System.out.println("max(12, 18) = " + Integer.max(12, 18));
        System.out.println("min(12, 18) = " + Integer.min(12, 18));

        // 输出int型的最大值和最小值
        System.out.println("int max = " + Integer.MAX_VALUE);
        System.out.println("int min = " + Integer.MIN_VALUE);
    }
}
运行结果为:

num = 123
128 to Octal = 200
128 to hex = 80
max(12, 18) = 18
min(12, 18) = 12
int max = 2147483647
int min = -2147483648

推荐阅读

副业交流群 关注微信公众号,加入副业交流群,学习变现经验,交流各种打法。