4.2.1 数值类型包装
方法的出现缘于优化代码结构,但它的意义并不局限于此,正因为有了方法定义,编程语言才更像一门能够解决实际问题的工具,而不仅仅是用于加减乘除的计算器。在数学的发展过程中,为了表示四则运算,人们创造了加减乘除符号,对应Java编程的“+”“-”“*”和“/”。但是随着运算类型的增多,新的运算符号来不及创造了,于是出现了函数形式的运算操作,譬如三角函数sin、cos等。这种数学函数就是方法的雏形,对于三角函数来说,弧度类似方法的输入参数,而函数值类似方法的输出参数。
自从有了方法,大部分的数学计算都可以使用方法来表达,不过基本数值类型如int、long等由于设计上的缘故,它们的变量并不能直接调用方法。因此,Java另外为基本类型定义了对应的包装类型,通过包装变量才能调用相关的算术方法。表4-1是基本数值类型与包装数值类型的关系说明。
表4-1 基本类型与包装类型的对照关系
包装类型与基本类型一样,首先要声明包装变量,然后对该变量赋值。给包装变量赋值(或称初始化)有3种方式,分别介绍如下:
(1)直接通过等号把具体数字赋值给包装变量,代码示例如下:
// 初始化包装变量的第一种方式:直接用等号赋值 Integer oneInteger=1;
(2)调用Integer的valueOf方法完成指定数字的赋值,这里可将Integer换成该数字想要表达的包装类型,具体赋值代码如下:
// 初始化包装变量的第二种方式:调用包装类型的valueOf方法 Integer oneInteger=Integer.valueOf(1);
(3)使用关键字new创建新的包装变量,形如“new包装类型名称(具体数字)”。下面是该方式的赋值代码例子:
// 初始化包装变量的第三种方式:使用关键字new创建新变量 Integer oneInteger=new Integer(1);
包装变量的初始化方式为什么这么多呢?仿佛孔乙己号称茴香豆的茴字有4种写法。其实无论是设计师还是程序员,大家都是人,有的喜欢简单点,有的希望严谨点,有的邋里邋遢,有的循规蹈矩,所谓萝卜青菜各有所爱,众口难调罢了。所以给包装变量赋值的写法只好一一照顾众人的口味,既有简单直白的写法,又有意思明了的写法,还有面向对象的写法,总有一款适合你。
既然可以把基本类型的变量直接赋值给包装变量,那么反过来能否直接将包装变量赋值给基本变量呢?很遗憾这个操作是不允许的,并且不能使用基本类型之间的强制类型转换,只能通过指定方法获得对应的基本变量数值。例如,要想把包装变量赋值给整型变量,则需调用该包装变量的intValue方法。以此类推,从包装变量获取字节数值、短整数值、长整数值、浮点数值、双精度数值,就得分别调用包装变量的byteValue方法、shortValue方法、longValue方法、floatValue方法、doubleValue方法。下面是将包装变量赋值给各种基本类型变量的代码例子(完整代码见本章源码的src\com\method\pack\PackNumber.java):
Integer oneInteger=1; // 初始化包装变量的第一种方式:直接用等号赋值 System.out.println("oneInteger="+oneInteger); // 把包装变量转换成字节变量,需要调用包装变量的byteValue方法 byte oneByte=oneInteger.byteValue(); //把包装变量转换成字节变量 System.out.println("oneByte="+oneByte); short oneShort=oneInteger.shortValue(); //把包装变量转换成短整变量 System.out.println("oneShort="+oneShort); int oneInt=oneInteger.intValue(); //把包装变量转换成整型变量 System.out.println("oneInt="+oneInt); long oneLong=oneInteger.longValue(); //把包装变量转换成长整变量 System.out.println("oneLong="+oneLong); float oneFloat=oneInteger.floatValue(); //把包装变量转换成浮点变量 System.out.println("oneFloat="+oneFloat); double oneDouble=oneInteger.doubleValue(); //把包装变量转换成双精度变量 System.out.println("oneDouble="+oneDouble);