“类型转换”(Cast)的原意是“与一个模型匹配”。在适当的时候,Java 会将一种数据类型自
动转换成另一种。例如,假设我们为某浮点变量赋以一个整数值,编译器会将 int 自动转换
成 float。类型转换运算允许我们显式地进行这种类型的转换,或者在不能自动进行转换的
时候强制进行类型转换。
要想执行类型转换,需要将希望得到的数据类型(包括所有修饰符)置于小括号内,放在要
进行类型转换的值的左边。下面是一个例子:
void casts() {
int i = 200;
long l = (long)i;
long l2 = (long)200;
}
正如你所看到的,既可对一个数值进行类型转换,亦可对一个变量进行类型转换。但在这儿
展示的两种情况,类型转换均是多余的,因为编译器在必要的时候会自动进行 int 值到 long
值的提升。但是你仍然可以做这样“多余的”事,以提醒自己需要留意,也可以使代码更清
楚。在其他情况下,可能只有先进行类型转换,代码编译才能通过。
在 C 和 C++中,类型转换有时会让人头痛。但是在 Java 中,类型转换则是一种比较安全的
操作。然而,如果要执行一种名为“窄化转换”(Narrowing Conversion)的操作(也就是说,
当你将能容纳更多信息的数据类型转换成无法容纳那么多信息的类型时),就有可能面临信
息丢失的危险。此时,编译器会强制我们进行类型转换,这实际上相当于说:“这可能是一
件危险的事情,如果您无论如何一定要让我这么做,您必须显式地进行类型转换。”而对于“扩
展转换”(Widening conversion),则不必进行显式地类型转换,因为新类型肯定能容纳原来
类型的信息,不会造成任何信息的丢失。
Java 允许我们把任何基本数据类型转换成为别的基本数据类型,但布尔型值除外,后者根本
不允许进行任何类型转换处理。“类”不允许进行类型转换。为了将一种类转换成另一种,必
须采用特殊的方法(字符串是一种特殊的情况。本书后面会讲到,一个对象可以在其所属类
的类族之间可以进行类型转换;例如,“橡树”可转型为“树”;反之亦然。但不能把它转换成
动转换成另一种。例如,假设我们为某浮点变量赋以一个整数值,编译器会将 int 自动转换
成 float。类型转换运算允许我们显式地进行这种类型的转换,或者在不能自动进行转换的
时候强制进行类型转换。
要想执行类型转换,需要将希望得到的数据类型(包括所有修饰符)置于小括号内,放在要
进行类型转换的值的左边。下面是一个例子:
void casts() {
int i = 200;
long l = (long)i;
long l2 = (long)200;
}
正如你所看到的,既可对一个数值进行类型转换,亦可对一个变量进行类型转换。但在这儿
展示的两种情况,类型转换均是多余的,因为编译器在必要的时候会自动进行 int 值到 long
值的提升。但是你仍然可以做这样“多余的”事,以提醒自己需要留意,也可以使代码更清
楚。在其他情况下,可能只有先进行类型转换,代码编译才能通过。
在 C 和 C++中,类型转换有时会让人头痛。但是在 Java 中,类型转换则是一种比较安全的
操作。然而,如果要执行一种名为“窄化转换”(Narrowing Conversion)的操作(也就是说,
当你将能容纳更多信息的数据类型转换成无法容纳那么多信息的类型时),就有可能面临信
息丢失的危险。此时,编译器会强制我们进行类型转换,这实际上相当于说:“这可能是一
件危险的事情,如果您无论如何一定要让我这么做,您必须显式地进行类型转换。”而对于“扩
展转换”(Widening conversion),则不必进行显式地类型转换,因为新类型肯定能容纳原来
类型的信息,不会造成任何信息的丢失。
Java 允许我们把任何基本数据类型转换成为别的基本数据类型,但布尔型值除外,后者根本
不允许进行任何类型转换处理。“类”不允许进行类型转换。为了将一种类转换成另一种,必
须采用特殊的方法(字符串是一种特殊的情况。本书后面会讲到,一个对象可以在其所属类
的类族之间可以进行类型转换;例如,“橡树”可转型为“树”;反之亦然。但不能把它转换成
类族以外的类型,如“岩石”)。