购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.5 数据类型转换

Java语言的数据类型在定义时就已经确定,因此不能随意转换成其他的数据类型,但Java语言容许用户有限度地做类型转换处理,这就是所谓的数据类型转换,简称类型转换。类型转换就是在Java程序中,将常数或变量从一种数据类型转换到另一种数据类型,但这种转换是有条件的,并不是一种数据类型能任意地转换为另一种数据类型。

1. 数值型不同类型数据的转换

由于数值型分为不同的类型,所以数值型数据有类型转换问题。数值型数据的类型转换分为自动类型转换(或称隐含类型转换)和强制类型转换两种。凡是把占用比特数较少的数据(简称较短的数据)转换成占用比特数较多的数据(简称较长的数据),都使用自动类型转换,即类型转换由编译系统自动完成,不需要程序做特别的说明。但如果把较长的数据转换成较短的数据时,就要使用强制类型转换,否则就会产生编译错误。

1)自动类型转换

在程序中已经定义好的数值型的变量,若是想以另一种数值类型表示时,Java语言会在下列条件同时成立时,自动进行数据类型的转换。

①转换前的数据类型与转换后的类型兼容。

②转换后数据类型的表示范围比转换前数据类型的表示范围大。

条件②说明不同类型的数据进行运算时,需先转换为同一类型,然后进行运算。转换从“短”到“长”的优先关系为:

举例来说,若是想将short类型的变量a转换为int类型,由于short与int皆为整数类型,符合上述条件①,而int的表示范围比short来得大,也符合条件②,因此Java语言会自动将原为short类型的变量a转换为int类型。

值得注意的是,类型的转换只限该语句本身,并不会影响原先变量的类型定义,而且通过自动类型的转换,可以保证数据的精确度,它不会因为类型转换而损失数据的内容。这种类型的转换方式也称为扩大转换(augmented conversion)。

在一个表达式中若有整数类型为short或byte的数据参加运算,为了避免溢出,Java会将表达式中的short或byte类型的数据自动转换成int类型,这样就可以保证其运算结果的正确性,这也是Java语言所提供的“扩大转换”功能。

由于boolean类型只能存放true或false,与整数及字符不兼容,因此不可能做类型的转换。接下来看一看当两个数中有一个为浮点数时,其运算的结果如何?

【例3.1】 数据类型的自动转换。

输出结果为:

     a=155,b=21.0
     a/b=7.3809524

程序中第8、9两行的System.out.println()语句,其功能是输出括号中表达式的值然后换行。由运行的结果可以看到,当两个数中有一个为浮点数时,其运算的结果会直接转换为浮点数。当表达式中变量的类型不同时,Java会自动将较小的表示范围转换成较大的表示范围后,再做运算。也就是说,假设有一个整数和双精度浮点数做运算时,Java会把整数转换成双精度浮点数后再做运算,运算结果也会变成双精度浮点数。

2)强制类型转换

如果要将较长的数据转换成较短的数据时,就要进行强制类型转换。强制类型转换的格式如下:

     (欲转换的数据类型)变量名

这种强制类型的转换,因为是直接编写在程序代码中,所以也称为显性转换(explicit cast)。经过强制类型转换,将得到一个括号里声明的数据类型的数据,该数据是从指定变量名中所包含的数据转换而来的,但是指定的变量及其数据本身将不会因此而转变。下面的程序说明了在Java语言中是如何进行数据类型强制转换的。

【例3.2】 整型与浮点数据类型的转换。

程序执行结果如下:

     a=155,b=9
     a/b=17.0
a=155,b=9 a/b=17.222221 (int)h=17

当两个整数相除时,小数点之后的数字会被截断,使得运算的结果保持为整数。但由于这并不是预期的计算结果,因此想要使运算的结果为浮点数,就必须将两个整数中的一个或是两个强制转换为浮点数类型,例如下面的三种写法均成立:

     (float)a/b    //将整数a强制转换成浮点数,再与整数b相除
     a/(float)b    //将整数b强制转换成浮点数,再以整数a除之
     (float)a/(float)b //将整数a与b同时强制转换成浮点数

只要在变量名前面加上欲转换的类型,如例中第15行中的变量h,程序运行时就会自动将此行语句里的变量做类型转换的处理,并不影响原先定义的类型。

此外,若是将一个大于变量可表示范围的值赋值给这个变量时,这种转换称为缩小转换(narrowing conversion)。由于缩小转换在转换的过程中可能会因此损失数据的精确度,Java并不会自动做这种类型的转换,此时必须由程序员做强制性的转换。

注意: 在程序设计过程中,不推荐从较长数据向较短数据的转换,因为从较长数据向较短数据转换的过程中,由于数据存储位数的缩小,将导致计算数据精度的降低。

2. 字符串型数据与整型数据相互转换

1)字符串转换成数值型数据

数字字符串型数据转换成byte、short、int、float、double、long等数据类型,或将字符串"true"、"false"转换成相应的布尔类型,可以分别使用表3.7所提供的Byte、Short、Integer、Long、Double、Float和Boolean类的parseXXX()方法完成。

表3.7 字符串转换成数值型数据的方法

例如:

     String myNumber="1234.567";  //定义字符串型变量myNumber
     float myFloat=Float.parseFloat(myNumber);

第2条语句是将字符串型变量myNumber的值转换成浮点型数据后,赋给变量myFloat。

2)数值型数据转换成字符串

在Java语言中,字符串可用加号“+”来实现连接操作。所以若其中某个操作数不是字符串,该操作在连接之前会自动将其转换成字符串,因此可用加号来实现自动的转换。如:

     int myInt=1234;       //定义整型变量myInt
     String myString=""+myInt;  //将整型数据转换成了字符串

其他数值型数据类型也可以利用同样的方法转换成字符串。 4pJgaYca6p++8j+QXulY27XOdlGImVRtgNfi8F4GVjT9nm2fPzaejtng0atztpYV

点击中间区域
呼出菜单
上一章
目录
下一章
×