包装类

Java 是一种面向对象语言,但在 Java 中不能定义基本数据类型的对象,为了能将基本数据类型视为对象进行处理,Java 提出了包装类的概念,它主要是将基本数据类型封装在包装类中,如 int 型的包装类 Integer、boolean 型的包装类 Boolean 等,这样便可以把这些基本数据类型转换为对象进行处理。Java 中的包装类及其对应的基本数据类型如表11.1所示。

image 2024 03 01 16 18 50 631
Figure 1. 表11.1 包装类及其对应的基本数据类型

Java 是可以直接处理基本数据类型的,但在有些情况下需要将其作为对象来处理,这时就需要将其转换为包装类,这里的包装类相当于基本数据类型与对象类型之间的一个桥梁。由于包装类和基本数据类型间的转换,引入了装箱和拆箱的概念:装箱就是将基本数据类型转换为包装类,而拆箱就是将包装类转换为基本数据类型,这里只需要简单了解这两个概念即可。

Integer类

java.lang 包中的 Integer 类、Byte 类、Short 类和 Long 类,分别将基本数据类型 int、byte、short 和 long 封装成一个类,由于这些类都是 Number 类的子类,因此它们包含的方法基本相同,区别就是它们封装不同的数据类型。本节以 Integer 类为例来讲解整数包装类。

Integer 类在对象中包装了一个基本数据类型 int 的值,该类的对象包含一个 int 类型的字段。此外,该类提供了多个方法,这些方法可以在 int 类型和 String 类型之间进行转换,同时还提供了其他一些处理 int 类型时非常有用的常量和方法。Integer 类的常用方法如表11.2所示。

image 2024 03 01 16 21 50 426
Figure 2. 表11.2 Integer类的常用方法

下面通过一个实例演示 Integer 类的常用方法的使用。

【例11.1】Integer类的常用方法(实例位置:资源包\TM\sl\11\1)

创建一个 IntegerDemo 类,其中:首先使用 Integer 类的 parseInt() 方法将一个字符串转换为 int 数据;然后创建一个 Integer 对象,并调用其 equals() 方法与转换的 int 数据进行比较;最后演示使用 Integer 类的 toBinaryString() 方法、toHexString() 方法、toOctalString() 方法和 toString() 方法将 int 数据转换为二进制、十六进制、八进制和不常使用的十五进制表示形式。

public class IntegerDemo {
	public static void main(String[] args) {
		int num = Integer.parseInt("456"); // 将字符串转换为int类型
		Integer iNum = Integer.valueOf("456"); // 通过构造函数创建一个Integer对象
		System.out.println("int数据与Integer对象的比较:" + iNum.equals(num));
		String str2 = Integer.toBinaryString(num); // 获取数字的二进制表示
		String str3 = Integer.toHexString(num); // 获取数字的十六进制表示
		String str4 = Integer.toOctalString(num); // 获取数字的八进制表示
		String str5 = Integer.toString(num, 15); // 获取数字的十五进制表示
		System.out.println("456的二进制表示为:" + str2);
		System.out.println("456的十六进制表示为:" + str3);
		System.out.println("456的八进制表示为:" + str4);
		System.out.println("456的十五进制表示为:" + str5);
	}
}

运行结果如下:

     int数据与Integer对象的比较:true
     456的二进制表示为:111001000
     456的十六进制表示为:1c8
     456的八进制表示为:710
     456的十五进制表示为:206

Integer 类提供了以下 4 个常量。

  • MAX_VALUE:表示 int 类型可取的最大值,即 231-1。

  • MIN_VALUE:表示 int 类型可取的最小值,即-231

  • SIZE:用来以二进制补码形式表示 int 值的位数。

  • TYPE:表示基本类型 int 的 Class 实例。

【例11.2】查看Integer类的常量值(实例位置:资源包\TM\sl\11\2)

在项目中创建 GetCon 类,在主方法中实现将 Integer 类的常量值进行输出。

public class GetCon { // 创建类GetCon
	public static void main(String args[]) { // 主方法
		int maxint = Integer.MAX_VALUE; // 获取Integer类的常量值
		int minint = Integer.MIN_VALUE;
		int intsize = Integer.SIZE;
		System.out.println("int类型可取的最大值是:" + maxint); // 将常量值输出
		System.out.println("int类型可取的最小值是:" + minint);
		System.out.println("int类型的二进制位数是:" + intsize);
	}
}

运行结果如下:

     int类型可取的最大值是:2147483647
     int类型可取的最小值是:-2147483648
     int类型的二进制位数是:32

Double类

Double 类和 Float 类分别封装的是基本类型 double 和 float。由于它们都是 Number 类的子类,并且都是对浮点数进行操作的,因此它们的常用方法基本相同。本节将对 Double 类进行讲解。对于 Float 类,读者可以参考 Double 类的相关内容。

Double 类在对象中包装一个基本类型为 double 的值,每个 Double 类的对象都包含一个 double 类型的字段。此外,该类还提供多个方法,可以将 double 类型转换为 String 类型,将 String 类型转换为 double 类型,也提供了其他一些处理 double 类型时有用的常量和方法。Double 类的常用方法如表11.3所示。

image 2024 03 01 16 32 44 978
Figure 3. 表11.3 Double类的常用方法

下面通过一个实例来演示 Double 类的常用方法的使用。

【例11.3】Double类的常用方法(实例位置:资源包\TM\sl\11\3)

创建一个 DoubleDemo 类,首先使用 Double 类的 valueOf() 方法创建一个 Double 对象,然后使用 Double 类的常用方法对该对象进行操作,并查看它们的显示结果。

public class DoubleDemo {
	public static void main(String[] args) {
		Double dNum = Double.valueOf("3.14"); // 通过构造函数创建一个Integer对象
		// 判断是否为非数字值
		System.out.println("3.14是否为非数字值:" + Double.isNaN(dNum.doubleValue()));
		System.out.println("3.14转换为int值为:" + dNum.intValue()); // 转换为int类型
		// 判断大小
		System.out.println("值为3.14的Double对象与3.14的比较结果:" + dNum.equals(3.14));
		// 转换为十六进制
		System.out.println("3.14的十六进制表示为:" + Double.toHexString(dNum));
	}
}

运行结果如下:

     3.14是否为非数字值:false
     3.14转换为int值为:3
     值为3.14的Double对象与3.14的比较结果:true
     3.14的十六进制表示为:0x1.91eb851eb851fp1

Double 类主要提供了以下常量。

  • MAX_EXPONENT:返回 int 值,表示有限 double 变量可能具有的最大指数。

  • MIN_EXPONENT:返回 int 值,表示标准化 double 变量可能具有的最小指数。

  • NEGATIVE_INFINITY:返回 double 值,表示保存 double 类型的负无穷大值的常量。

  • POSITIVE_INFINITY:返回 double 值,表示保存 double 类型的正无穷大值的常量。

Boolean类

Boolean 类将基本类型为 boolean 的值包装在一个对象中。一个 Boolean 类型的对象只包含一个类型为 boolean 的字段。此外,此类还为 boolean 类型和 String 类型的相互转换提供了许多方法,并提供了处理 boolean 类型时非常有用的其他一些常量和方法。Boolean 类的常用方法如表11.4所示。

image 2024 03 01 16 36 50 514
Figure 4. 表11.4 Boolean类的常用方法

【例11.4】Boolean类的常用方法(实例位置:资源包\TM\sl\11\4)

在项目中创建 BooleanDemo 类,在主方法中以不同的构造方法创建 Boolean 对象,并调用 booleanValue() 方法将创建的对象重新转换为 boolean 类型数据输出。

public class BooleanDemo {
	public static void main(String args[]) { // 主方法
		Boolean b1 = Boolean.valueOf("true");  // 创建 Boolean 对象
		Boolean b2 = Boolean.valueOf("ok");
		System.out.println("b1: " + b1.booleanValue());
		System.out.println("b2: " + b2.booleanValue());
	}
}

运行结果如下:

     b1:true
     b2:false

Boolean 提供了以下 3 个常量。

  • TRUE:对应基值 true 的 Boolean 对象。

  • FALSE:对应基值 false 的 Boolean 对象。

  • TYPE:基本类型 boolean 的 Class 对象。

Character类

Character 类在对象中包装一个基本类型为 char 的值,该类提供了多种方法,以确定字符的类别(小写字母、数字等),并可以很方便地将字符从大写转换成小写,反之亦然。Character 类提供了很多方法来完成对字符的操作,常用的方法如表11.5所示。

image 2024 03 01 16 41 57 926
Figure 5. 表11.5 Character类的常用方法

下面通过实例来演示 Character 类的大小写的转换方法的使用,其他方法的使用与其类似。

【例11.5】Character类的常用方法(实例位置:资源包\TM\sl\11\5)

在项目中创建 UpperOrLower 类,在主方法中创建 Character 类的对象,通过判断字符的大小写状态确认将其转换为大写还是小写。

public class UpperOrLower {
	public static void main(String args[]) { // 主方法
		Character mychar1 = Character.valueOf('A'); // 声明Character对象
		Character mychar2 = Character.valueOf('a'); // 声明Character对象
		if (Character.isUpperCase(mychar1)) { // 判断是否为大写字母
			System.out.println(mychar1 + "是大写字母 ");
			// 转换为小写
			System.out.println("转换为小写字母的结果: " + Character.toLowerCase(mychar1));
		}
		if (Character.isLowerCase(mychar2)) { // 判断是否为小写字母
			System.out.println(mychar2 + "是小写字母");
			// 转换为大写
			System.out.println("转换为大写字母的结果: " + Character.toUpperCase(mychar2));
		}
	}
}

运行结果如下:

     A是大写字母
     转换为小写字母的结果: a
     a是小写字母
     转换为大写字母的结果: A

Character 类提供了大量表示特定字符的常量,例如:

  • CONNECTOR_PUNCTUATION:返回 byte 型值,表示 Unicode 规范中的常规类别 “Pc”。

  • UNASSIGNED:返回 byte 型值,表示 Unicode 规范中的常规类别 “Cn”。

  • TITLECASE_LETTER:返回 byte 型值,表示 Unicode 规范中的常规类别 “Lt”。

Character 类提供的常量有很多个,详细列表可查看 Java API 文档。

Number类

前面介绍了 Java 中的包装类,对于数值型的包装类,它们有一个共同的父类—Number类。Number 类是一个抽象类,它是 Byte、Integer、Short、Long、Float 和 Double 类的父类,其子类必须提供将表示的数值转换为 byte、int、short、long、float 和 double 的方法。例如,doubleValue() 方法返回双精度浮点值,floatValue() 方法返回单精度浮点值,这些方法如表11.6所示。

image 2024 03 01 16 45 13 733
Figure 6. 表11.6 数值型包装类的共有方法

Number 类的方法分别被其各子类所实现,也就是说,在 Number 类的所有子类中都包含以上这几种方法。

编程训练(答案位置:资源包\TM\sl\11\编程训练)

【训练1】计算字符串数字的平方值 将字符串 “351” 转换成 int 值,并计算该值的平方。

【训练2】判断字符是数字还是字母 判断字符串 “JDK 11.0.1” 上每个字符是数字还是字母。