《Java核心技术 卷I》对象包装器与自动装箱
对象包装器与自动装箱
有时需要int这样的基本类型转换为对象,所有的基本类型都有一个与之对应的类。
例如,Integer类对应基本类型int,通常这些类称为包装类(wrapper)。
包装器类名字鲜明,Byte、Short、Integer、Long、Float、Double,这6个派生于公共的超类Number。
还有Character、Void、Boolean。
对象包装器类是不可变的,即一旦构造了包装器,就不允许更改包装在其中的值,同时,对象包装器类还是final,因此不能定义它们的子类。
假设想定义一个整形数组列表,而尖括号中的类型参数不允许是基本类型,也就是说,不允许写成ArrayList,这里就用到了Integer对象包装类。
警告:由于每个值分别包装在对象中,所以ArrayList的效率远远低于int[]数组,因此用它构造小型集合,其原因是此时程序员的方便性要比执行效率更加重要。
JavaSE5另一个改进之处是便于添加和获得数组元素,例如:
list.add(3)将自动地变换成list.add(Integer.valueOf(3))
这种变换被称为自动装箱(autoboxing)。
相反的,将Integer对象赋值给一个int时,会自动地拆箱,int n = list.get(i);翻译成 int n = list.get(i).intValue();
在算术表达式中也能自动装箱和拆箱,Integer n = 3; n++;
以上编译器将自动地插入一条对象拆箱的指令,然后进行自增计算,最后再将结果装箱。
由于Integer对象是不可变的,包含在包装器中的内容不会改变,不能使用这些包装器类创建修改数值参数的方法。
想要编写一个修改数值参数值的方法,就需要使用在org.omg.CORBA包中定义的持有者(holder)类型,包括IntHolder、BooleanHolder等。
API java.lang.Integer 1.0
- int intValue(),以int的形式返回Integer对象的值
- static String toString(int i),以一个新的String对象的形式返回给定数值i的十进制表示。
- static String toString(int i, int radix),返回数值i的基于给定radix参数进制的表示。
- static int parseInt(String s,int radix),返回字符串s表示的整形数值,给定字符串表示的十进制整数或者radix参数进制的整数。
- static Integer valueOf(String s)
- static Integer valueOf(String s,int radix),返回用s表示的整形数值进行初始化后的一个新Integer对象,给定字符串表示的是十进制的整数(第一种方法),或者radix参数进制的整数(第二种方法)。
API java.text.NumberFormat
- Number parse(String s),返回数字值,假设给定的String表示了一个数值。
参数数量可变的方法
调用打印方法。。。
public PrintStream printf(String format, Object ... args) {return format(format, args);}
这里的省略号..是Java代码的一部分,表明这个方法可以接收任意数量的对象(除fmt参数之外)。
实际上,printf方法接收两个参数,一个是格式字符串,另一个是Object[]数组,其中保存着所有的参数(如果是基础类型,会自动装箱称为对象),然后扫描fmt字符串,并将第i个格式说明符与args[i]的值匹配起来,换句话说Object...参数类型和Object[]完全一样。
用户可以自己定义可变参数的方法,并将参数指定为任意类型,甚至是基本类型。下面是一个简单的示例:其功能为计算若干个数值的最大值。
package corejava;public class MaxDoubleTest {public static void main(String[] args) {System.out.println(max(3.232132,6.232344,5.823485));System.out.println(max());}public static double max(double... values) {double largest = Double.MIN_VALUE;for (double d : values) {if(d > largest) {largest = d;}}return largest;}}
//结果
//6.232344
//4.9E-324
编译器将new double[]{3.232132,6.232344,5.823485}传递给max方法
注释:允许将一个数组传给可变参数方法的最后一个参数。
System.out.printf("%d %s",new Object[] {new Integer(1), "widgets"}); //1 widgets
因此,可以将已经存在且最后一个参数是数组的方法重新定义为可变参数的方法,而不会破坏任何已经存在的代码。例如,MessageFormat.format在JavaSE5就采用了这种方式,甚至可以将main方法声明为如下形式:
public static void main(String... args) {System.out.println(max(3.232132,6.232344,5.823485));System.out.println(max());System.out.printf("%d %s",new Object[] {new Integer(1), "widgets"});}