程序语言之灵魂续二

来源:互联网 发布:工商银行理财软件 编辑:程序博客网 时间:2024/04/30 00:34
Java 的数据类型在定义时就已经确定了,因此不能随意转换成其它的数据类型,但 Java 容许用户有限度地做类型转换处理。数据类型的转换方式可分为“自动类型转换”及“强制类型转换”两种。

自动类型转换
在程序中已经定义好了数据类型的变量,若是想用另一种数据类型表示时,Java会在下列的条件皆成立时,自动做数据类型的转换:
1、转换前的数据类型与转换后的类型兼容。
2、转换后的数据类型的表示范围比转换前的类型大。
举例来说,若是想将 short 类型的变量 a 转换为 int 类型,由于 short 与 int 皆为整数类型,符合上述条件 1;而 int 的表示范围比 short 大,亦符合条件 2。因此 Java 会自动将原为 short 类型的变量 a 转换为 int 类型。值得注意的是, 类型的转换只限该行语句, 并不会影响原先所定义的变量的类型,而且通过自动类型的转换, 可以保证数据的精确度, 它不会因为转换而损失数据内容。这种类型的转换方式也称为扩大转换。
前面曾经提到过,若是整数的类型为 short 或 byte,为了避免溢出,Java 会将表达式中的 short 和 byte 类型自动转换成 int 类型,即可保证其运算结果的正确性,这也是 Java 所提供的“扩大转换”功能。以 “扩大转换” 来看可能比较容易理解——字符与整数是可使用自动类型转换的;整数与浮点数亦是兼容的;但是由于 boolean 类型只能存放 true 或 flase,与整数及字符是不兼容, 因此是不可能做类型的转换。 

接下来看看当两个数中有一个为浮点数时,其运算的结果会有什么样的变化?
// 下面这段程序声明了两个变量,一个是整型,一个是浮点型
public class TestJava{
public static void main(String args[]){
int a = 156 ;
 float b = 24.1f ;  // 声明一浮点型变量 f,并赋值
System.out.println("a = "+a+" , b = "+b);
System.out.println("a / b = "+(a/b));  // 这里整型会自动转化为浮点型
}
}
输出结果:
------------------------------------------
a = 156 , b = 24.0
a / b = 6.5
  从运行的结果可以看出,当两个数中有一个为浮点数时,其运算的结果会直接转换为浮点数。当表达式中变量的类型不同时,Java 会自动以较小的表示范围转换成较大的表示范围后,再作运算。也就是说,假设有一个整数和双精度浮点数作运算时,Java 会把整数转换成双精度浮点数后再作运算,运算结果也会变成双精度浮点数。


强制类型转换
当两个整数进行运算时,其运算的结果也会是整数。举例来说,当做整数除法 8/3的运算,其结果为整数 2,并不是实际的 2.6666…,因此在 Java 中若是想要得到计算的结果是浮点数时,就必须将数据类型做强制性的转换,转换的语法如下:
 (欲转换的数据类型)变量名称;
因为这种强制类型的转换是直接编写在程序代码中的,所以也称为显性转换。下面的程序说明了在 Java 里,整数与浮点数是如何转换的。
// 下面范例中说明了自动转换和强制转换这两种转换的使用方法
 public class TestJava{
public static void main(String args[]){
               int a = 55 ;
               int b= 9 ;
               float g,h ;
          System.out.println("a = "+a+" , b = "+b);
g = a/b ;
System.out.println("a / b ="+g+"\n");
System.out.println("a = "+a+" , b = "+b);
h = (float)a/b ; //在这里将数据类型进行强制类型转换
System.out.println("a /b = "+h);
 }
 }
输出结果:
------------------------------------------------
a = 55 , b = 9
a / b = 6.0
a = 55 , b = 9
a /b = 6.111111

须知:
只要在变量前面加上欲转换的数据类型,运行时就会自动将此行语句里的变量做类型转换的处理,但这并不影响原先所定义的数据类型。此外,若是将一个超出该变量可表示范围的值赋值给这个变量时,这种转换称为缩小转换。由于在转换的过程中可能会丢失数据的精确度,Java 并不会自动做这些类型的转换,此时就必须要做强制性的转换。
0 0