Java/包装类之道
对于 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 类中,有很多方法可以将字符转换为大写和小写,以及检查字符是否为数字、字母或符号。