跳转到内容

Java/包装类之道

来自 Wikibooks,开放世界中的开放书籍

包装类

[编辑 | 编辑源代码]

对于 Java 中的每种基本类型,都存在一个称为包装类的内置对象类型。例如,int 的包装类称为 Integer;double 的包装类称为 Double。

包装类很有用,原因有以下几点:


每个包装类都包含特殊值(如类型的最小值和最大值)以及用于在类型之间转换的有用方法。

您可以实例化包装类并创建包含基本值的​​对象。换句话说,您可以将基本值包装到一个对象中,如果您想调用需要对象类型的方法,这将很有用。


创建包装对象

[编辑 | 编辑源代码]

创建包装对象的​​最直接方法是使用它的构造函数

逐字

Integer i = new Integer (17);
Double d = new Double (3.14159);
Character c = new Character ('b');

逐字

从技术上讲,String 不是包装类,因为它没有相应的基元类型,但创建 String 对象的语法相同

逐字

String s = new String ("fred");

逐字

另一方面,没有人会使用 String 对象的构造函数,因为您可以通过简单的 String 值获得相同的效果

逐字

String s = "fred";

逐字

在我的开发环境中,Boolean 包装类没有正确实现。应该有一个接收基元 boolean 作为参数的构造函数,但以下代码

逐字

Boolean b = new Boolean (true);

逐字

会产生错误。

创建更多包装对象

[编辑 | 编辑源代码]

一些包装类具有第二个构造函数,该构造函数接收 String 作为参数并尝试转换为适当的类型。例如

逐字

Integer i = new Integer ("17");
Double d = new Double ("3.14159");

逐字

应该有一个接收 String 参数的 Boolean 构造函数,但它在我的开发环境中没有实现。对于 Characters 没有这样的构造函数。

类型转换过程不是很健壮。例如,如果字符串格式不正确,它们将导致 NumberFormatException。字符串中的任何非数字字符,包括空格,都会导致转换失败。

逐字

Integer i = new Integer ("17.1");        // WRONG!!
Double d = new Double ("3.1459 ");       // WRONG!!

逐字

在尝试转换之前,通常最好检查字符串的格式。

创建更多包装对象

[编辑 | 编辑源代码]

令人讨厌的是,还有一种创建包装对象的方法,使用包装类中的类方法。

逐字

Integer i = Integer.valueOf ("17");
Double d = Double.valueOf ("3.14159");

逐字

这些方法使用与构造函数相同的转换方法(parseInt 和 parseDouble),因此它们没有更健壮。

当有两种方法可以做同一件事时,最好选择一种并始终如一地坚持使用。在本例中,我认为使用构造函数比使用 valueOf 好得多,因为它更清楚地表明您正在创建新的包装对象。valueOf 的名字选得不好;鉴于这个名字,它完全不清楚它的作用。

获取值

[编辑 | 编辑源代码]

Java 知道如何打印包装对象,因此提取值的​​最简单方法就是打印该对象

逐字

Integer i = new Integer (17);
Double d = new Double (3.14159);
System.out.println (i);
System.out.println (d);

逐字

或者,您可以使用 toString 方法将包装对象的内容转换为字符串

逐字

String istring = i.toString();
String dstring = d.toString();

逐字

最后,如果您只是想从对象中提取基本值,每个包装类中都有一个对象方法可以完成这项工作

逐字

int iprime = i.intValue ();
double dprime = d.doubleValue ();

逐字

还有一些方法可以将包装类转换为不同的基元类型。

包装类中的有用方法

[编辑 | 编辑源代码]

正如我提到的,包装类包含与每个类型相关的有用方法。例如,Integer 包含用于解释和以不同基数打印整数的方法。如果您有一个包含以 6 进制表示的数字的字符串,可以使用 parseInt 转换为 10 进制。

逐字

String base6 = "12345";
int base10 = Integer.parseInt (base6, 6);
System.out.println (base10);

逐字

由于 parseInt 是一个类方法,因此您通过以点表示法命名类和方法来调用它。

6 进制可能不是那么有用,但十六进制(16 进制)和八进制(8 进制)在计算机科学相关的事情中很常见。

在 Character 类中,有很多方法可以将字符转换为大写和小写,以及检查字符是否为数字、字母或符号。

华夏公益教科书