Java开发笔记(二十七)数值包装类型
方法的出现缘起优化代码结构,但它的意义并不局限于此,正因为有了方法定义,编程语言才更像一门能解决实际问题的工具,而不仅仅是只能用于加减乘除的计算器。在数学的发展过程中,为了表示四则运算,人们创造了加减乘除符号,对应Java编程的“+”、“-”、“*”、“/”。但是随着运算类型的增多,新的运算符号来不及创造了,于是出现了函数形式的运算操作,譬如三角函数sin、cos等等。这种数学函数就是方法的雏形,对于三角函数来说,角度类似方法的输入参数,而函数值类似方法的输出参数。
自从有了方法,大部分的算术计算都可以使用方法来表达,不过基本数值类型如int、long等由于设计上的缘故,它们的变量并不能直接调用方法;因此Java另外为基本类型定义了对应的包装类型,通过包装变量才能调用相关的算术方法。下面是基本数值类型与包装数值类型的关系说明:
字节型byte,对应包装字节类型Byte
短整型short,对应包装短整类型Short
整型int,对应包装整型Integer
长整型long,对应包装长整类型Long
浮点型flotat,对应包装浮点类型Flota
双精度型double,对应包装双精度类型Double
包装类型与基本类型一样,首先要声明包装变量,然乎对该变量进行赋值。给包装变量赋值(或称初始化)有三种方式,分别介绍如下:
1、直接通过等号把具体数字赋值给包装变量,代码示例如下:
// 初始化包装变量的第一种方式:直接用等号赋值 Integer oneInteger = 1;
2、调用Integer的valueOf方法完成指定数字的赋值,这里可将Integer换成该数字想要表达的包装类型,具体赋值代码见下:
// 初始化包装变量的第二种方式:调用包装类型的valueOf方法 Integer oneInteger = Integer.valueOf(1);
3、使用关键字new创建新的包装变量,形如“new 包装类型名称(具体数字)”,下面是该方式的赋值代码例子:
// 初始化包装变量的第三种方式:使用关键字new创建新变量 Integer oneInteger = new Integer(1);
话说包装变量的初始化方式为啥这么多呢?仿佛孔乙己号称茴香豆的茴字有四种写法。其实不管设计师还是程序员,大家都是人,有的喜欢简单点,有的希望严谨点,有的邋里邋遢,有的循规蹈矩,所谓萝卜青菜各有所爱,众口难调罢了。所以给包装变量赋值的写法,也只好一一照顾众人的口味,既有简单直白的写法,也有意思明了的写法,还有面向对象的写法,总有一款适合你。
既然可以把基本类型的变量直接赋值给包装变量,那么反过来能否直接将包装变量赋值给基本变量呢?很遗憾这个操作是不允许的,并且也不能使用基本类型之间的强制类型转换,只能通过指定方法获得对应的基本变量数值。例如,要想把包装变量赋值给整型变量,则需调用该包装变量的intValue方法。依此类推,从包装变量获取字节数值、短整数值、长整数值、浮点数值、双精度数值,就得分别调用包装变量的byteValue方法、shortValue方法、longValue方法、floatValue方法、doubleValue方法。下面是将包装变量赋值给各种基本类型变量的代码例子:
// 初始化包装变量的第一种方式:直接用等号赋值 Integer oneInteger = 1; System.out.println("oneInteger="+oneInteger); // 把包装变量转换成字节变量,需要调用包装变量的byteValue方法 byte oneByte = oneInteger.byteValue(); System.out.println("oneByte="+oneByte); // 把包装变量转换成短整变量,需要调用包装变量的shortValue方法 short oneShort = oneInteger.shortValue(); System.out.println("oneShort="+oneShort); // 把包装变量转换成整型变量,需要调用包装变量的intValue方法 int oneInt = oneInteger.intValue(); System.out.println("oneInt="+oneInt); // 把包装变量转换成长整变量,需要调用包装变量的longValue方法 long oneLong = oneInteger.longValue(); System.out.println("oneLong="+oneLong); // 把包装变量转换成浮点变量,需要调用包装变量的floatValue方法 float oneFloat = oneInteger.floatValue(); System.out.println("oneFloat="+oneFloat); // 把包装变量转换成双精度变量,需要调用包装变量的doubleValue方法 double oneDouble = oneInteger.doubleValue(); System.out.println("oneDouble="+oneDouble);
对于数值包装变量来说,它们仍旧允许使用四则运算符进行计算操作,包括运算符“+”“-”“*”“/”“%”等等。然而若要判断两个包装变量是否相等,便不可通过双等号“==”来判断,而要调用包装变量的equals方法来校验。equals方法返回true表示待比较的两个包装变量值相等,返回false表示两个数值不等,调用equals方法的代码示例如下:
// 数值包装变量的equals方法相当于关系运算符“==” boolean equalResult = oneInteger.equals(2); System.out.println("equalResult="+equalResult);
除了基本的类型转换与数值运算之外,包装类型还提供了其它几种常见的逻辑方法。比如sum方法用来求两个数字之和,max方法用来求两个数字的较大值,min方法用来求两个数字的较小值。另有compare方法用来比较两个数字的大小,若二者相等则返回0,前者较小则返回-1,后者较小则返回1。这几个方法的调用代码例子如下:
int a = 7, b = 8; // 数值包装类型的sum方法相当于算术运算符“+” int sum = Integer.sum(a, b); System.out.println("sum="+sum); // 数值包装类型的max方法用来求两个数字的较大值 int max = Integer.max(a, b); System.out.println("max="+max); // 数值包装类型的min方法用来求两个数字的较小值 int min = Integer.min(a, b); System.out.println("min="+min); // 数值包装类型的compare方法用来比较两个数字的大小,二者相等则返回0,前者较小则返回-1,后者较小则返回1 int compareResult = Integer.compare(a, b); System.out.println("compareResult="+compareResult);
更多Java技术文章参见《Java开发笔记(序)章节目录》