1 什么是包装类
在进行类型转换时,有一种特殊的转换:将 int 这样的基本数据类型转换为对象,如下图所示:
所有基本类型都有一个与之对应的类,即包装类(wrapper)。因此,包装类即基本数据类型对应的类。
基本数据类型不能直接参与引用类型的使用或计算,使用包装类将基本数据类型转换为引用数据类型,可以参与到其他引用类型的使用。包装类如下表所示:
包装类中也提供了一些与类型相关的常用方法,可以简化开发者对基本数据类型的操作。
2 包装类的赋值示例
编写代码,测试基本数据类型与包装类的相互转换。代码示意如下:
public class WrapperDemo1 {
public static void main(String[] args) {
int num = 128;
//基本类型转换为包装类
Integer i1 = Integer.valueOf(num);
Integer i2 = Integer.valueOf(num);
System.out.println(i1 == i2);//false
System.out.println(i1.equals(i2));//true
Double d1 = Double.valueOf(123.0);
Double d2 = Double.valueOf(123.0);
System.out.println(d1 == d2);//false
System.out.println(d1.equals(d2));//true
//包装类转换为基本类型
int i = i1.intValue();
System.out.println(i);
double d = i1.doubleValue();
System.out.println(d);
byte b = i1.byteValue();
System.out.println(b);
}
}
3 Number及其主要方法
抽象类 Number 是 Byte、Double、Float、Integer、Long 和 Short 类的父类,它定义了一些公共方法,用于将表示的数值转换为不同的数据类型。下面是 Number 类的主要方法:
- doubleValue():以 double 类型返回表示的数值。
- intValue():以 int 类型返回表示的数值。
- floatValue():以 float 类型返回表示的数值。
这些方法允许将 Number 类的子类对象转换为不同的数据类型,以便在程序中进行数值的操作和处理。
请注意,Number 类本身是一个抽象类,不能直接实例化,而是用作其他数值类的基类。其子类如 Byte、Double、Float、Integer、Long 和 Short 提供了这些方法的具体实现,并为特定类型的数值提供了更多的功能和操作。
使用 Number 类及其子类,您可以执行各种数值计算和转换操作,根据具体的需求将数值对象转换为不同的数据类型。
4 Integer 常用功能
Integer类提供了多个方法,用于在int类型和String类型之间进行转换,并且还定义了一些常量。下面是一些常用的Integer方法和常量:
- static int MAX_VALUE:该常量的值为231 - 1,表示int类型可以表示的最大值。
- static int MIN_VALUE:该常量的值为-231,表示int类型可以表示的最小值。
- parseInt(String s):这是一个静态方法,用于将字符串转换为int类型的值(前提是字符串必须表示一个整数)。如果字符串不是合法的整数表示形式,会抛出NumberFormatException异常。
下面是一个示例代码,演示了使用parseInt方法将字符串转换为整数的过程:
public void testParseInt() {
String str = "123";
int value = Integer.parseInt(str);
System.out.println(value); // 123
str = "壹佰贰拾叁";
// 会抛出NumberFormatException
// value = Integer.parseInt(str);
}
在上述示例中,我们首先将字符串"123"通过parseInt方法转换为整数值123,并成功输出。然后,我们尝试将字符串"壹佰贰拾叁"转换为整数,由于该字符串不是一个合法的整数表示形式,会抛出NumberFormatException异常。
通过使用Integer类的这些方法,我们可以方便地在整数值和字符串之间进行转换,并进行相应的数据处理和操作。
5 Double常用功能
Double类用于包装基本类型double的值,可以通过构造方法将double类型的值包装成Double对象,构造方法如下:
Double(double value):使用指定的double值创建一个Double对象。
Double(String s):使用指定的字符串表示形式创建一个Double对象。
Double类还提供了一些常用的方法,其中包括:
double doubleValue():返回此Double对象的double值。
static double parseDouble(String s):将指定的字符串解析为double值,并返回一个新的double值。
这是一个使用Double类的示例代码:
Double num1 = new Double(3.14);
System.out.println(num1.doubleValue()); // 输出:3.14
String str = "2.718";
Double num2 = Double.parseDouble(str);
System.out.println(num2); // 输出:2.718
在上述示例中,我们使用构造方法将double类型的值和字符串转换为Double对象。然后,我们通过doubleValue方法获取Double对象的double值,并将其打印出来。另外,我们使用parseDouble方法将字符串"2.718"解析为double值,并将其存储在Double对象num2中。
通过Double类的这些方法,我们可以方便地进行double类型和Double对象之间的转换,以及对double值进行操作和处理。
6 包装类的功能示例
以下是一个使用包装类的功能示例代码,测试Integer的最大最小值,并将字符串解析为int和double类型:
package api_02;
public class WrapperDemo2 {
public static void main(String[] args) {
//获取int最大值?
int imax = Integer.MAX_VALUE;
System.out.println(imax);
int imin = Integer.MIN_VALUE;
System.out.println(imin);
long lmax = Long.MAX_VALUE;
System.out.println(lmax);
/*
* 包装类可以将字符串解析为对应的基本类型
* 前提是该字符串正确描述了基本类型可以保存
* 的值,否则解析时会抛出解析异常:
* NumberFormatException
*/
String str = "123";
int d = Integer.parseInt(str);
System.out.println(d);
double dou = Double.parseDouble(str);
System.out.println(dou);
}
}
在上述示例中,我们使用Integer.MAX_VALUE和Integer.MIN_VALUE分别获取了int类型的最大值和最小值,并将其打印出来。同样地,我们使用Long.MAX_VALUE获取了long类型的最大值,并将其打印出来。
接下来,我们使用Integer.parseInt()方法将字符串"123"解析为int类型,并将其打印出来。同时,我们使用Double.parseDouble()方法将字符串"123"解析为double类型,并将其打印出来。
通过这个示例,我们可以看到包装类的一些常用功能,包括获取最大最小值和将字符串解析为基本类型的值。这些功能方便了我们在处理数据时进行类型转换和数值获取。
7 自动拆装箱
自动拆箱和装箱是Java中的特性,用于在基本数据类型和对应的包装类之间进行转换,而无需手动编写转换代码。自动拆箱指的是从包装类对象中获取封装的基本数据类型值的操作,而自动装箱指的是将基本数据类型值封装到对应的包装类对象中的操作。
在 JDK 1.5 及以后的版本中,Java引入了自动拆箱和装箱的机制,使得操作更加方便。通过自动拆箱和装箱,我们可以直接在基本类型和包装类型之间进行赋值和运算,编译器会自动进行类型转换。
下面是自动拆箱和装箱的示例代码:
public class BoxingUnboxingDemo {
public static void main(String[] args) {
// 自动装箱
Integer num1 = 10;
Double num2 = 3.14;
// 自动拆箱
int value1 = num1;
double value2 = num2;
System.out.println("自动装箱后的值:" + num1 + ", " + num2);
System.out.println("自动拆箱后的值:" + value1 + ", " + value2);
}
}
在上述示例中,我们使用自动装箱将基本类型的值赋给对应的包装类对象,如Integer num1 = 10和Double num2 = 3.14。然后,使用自动拆箱将包装类对象中的值赋给基本类型变量,如int value1 = num1和double value2 = num2。
通过自动拆箱和装箱,我们可以直接在基本类型和包装类型之间进行赋值和运算,而不需要手动进行类型转换。这样的机制使得代码更加简洁、易读,并提高了开发效率。