造型(Cast)的作用是与一个模型匹配在适当的时候Java会将一种数据类型自动转换成另一种例如假设我们为浮点变量分配一个整数值计算机会将int自动转换成float通过造型我们可明确设置这种类型的转换或者在一般没有可能进行的时候强迫它进行
为进行一次造型要将括号中希望的数据类型(包括所有修改符)置于其他任何值的左侧下面是一个例子
void casts() {
int i = ;
long l = (long)i;
long l = (long);
}
正如您看到的那样既可对一个数值进行造型处理亦可对一个变量进行造型处理但在这儿展示的两种情况下造型均是多余的因为编译器在必要的时候会自动进行int值到long值的转换当然仍然可以设置一个造型提醒自己留意也使程序更清楚在其他情况下造型只有在代码编译时才显出重要性
在C和C++中造型有时会让人头痛在Java里造型则是一种比较安全的操作但是若进行一种名为缩小转换(Narrowing Conversion)的操作(也就是说脚本是能容纳更多信息的数据类型将其转换成容量较小的类型)此时就可能面临信息丢失的危险此时编译器会强迫我们进行造型就好象说这可能是一件危险的事情——如果您想让我不顾一切地做那么对不起请明确造型而对于放大转换(Widening conversion)则不必进行明确造型因为新类型肯定能容纳原来类型的信息不会造成任何信息的丢失
Java允许我们将任何主类型造型为其他任何一种主类型但布尔值(bollean)要除外后者根本不允许进行任何造型处理类不允许进行造型为了将一种类转换成另一种必须采用特殊的方法(字串是一种特殊的情况本书后面会讲到将对象造型到一个类型家族里例如橡树可造型为树反之亦然但对于其他外来类型如巖石则不能造型为树)
字面值
最开始的时候若在一个程序里插入字面值(Literal)编译器通常能准确知道要生成什么样的类型但在有些时候对于类型却是暧昧不清的若发生这种情况必须对编译器加以适当的指导方法是用与字面值关联的字符形式加入一些额外的信息下面这段代码向大家展示了这些字符
//: Literalsjava
class Literals {
char c = xffff; // max char hex value
byte b = xf; // max byte hex value
short s = xfff; // max short hex value
int i = xf; // Hexadecimal (lowercase)
int i = XF; // Hexadecimal (uppercase)
int i = ; // Octal (leading zero)
// Hex and Oct also work with long
long n = L; // long suffix
long n = l; // long suffix
long n = ;
//! long l(); // not allowed
float f = ;
float f = F; // float suffix
float f = f; // float suffix
float f = ef; // to the power
float f = e+f; // float suffix
double d = d; // double suffix
double d = D; // double suffix
double d = ed; // to the power
} ///:~
十六进制(Base )——它适用于所有整数数据类型——用一个前置的x或X指示并在后面跟随采用大写或小写形式的以及af若试图将一个变量初始化成超出自身能力的一个值(无论这个值的数值形式如何)编译器就会向我们报告一条出错消息注意在上述代码中最大的十六进制值只会在charbyte以及short身上出现若超出这一限制编译器会将值自动变成一个int并告诉我们需要对这一次赋值进行缩小造型这样一来我们就可清楚获知自己已超载了边界
八进制(Base )是用数字中的一个前置以及的数位指示的在CC++或者Java中对二进制数字没有相应的字面表示方法
字面值后的尾随字符标志着它的类型若为大写或小写的L代表long大写或小写的F代表float大写或小写的D则代表double
指数总是采用一种我们认为很不直观的记号方法ef在科学与工程学领域e代表自然对数的基数约等于(Java一种更精确的double值采用MathE的形式)它在象×e的次方这样的指数表达式中使用意味着×的次方然而自FORTRAN语言发明后人们自然而然地觉得e代表多少次幂这种做法显得颇为古怪因为FORTRAN最初面向的是科学与工程设计领域理所当然它的设计者应对这样的混淆概念持谨慎态度(注释①)但不管怎样这种特别的表达方法在CC++以及现在的Java中顽固地保留下来了所以倘若您习惯将e作为自然对数的基数使用那么在Java中看到象ef这样的表达式时请转换您的思维从程序设计的角度思考它它真正的含义是×的次方
①John Kirkham这样写道我最早于年在一部IBM 机器上使用FORTRAN II那时——包括年代以及年代的早期FORTRAN一直都是使用大写字母之所以会出现这一情况可能是由于早期的输入设备大多是老式电传打字机使用位Baudot码那种码并不具备小写能力乘幂表达式中的E也肯定是大写的所以不会与自然对数的基数e发生沖突后者必然是小写的E这个字母的含义其实很简单就是Exponential的意思即指数或幂数代表计算系统的基数——一般都是当时八进制也在程序员中广泛使用尽管我自己未看到它的使用但假若我在乘幂表达式中看到一个八进制数字就会把它认作Base 我记得第一次看到用小写e表示指数是在年代末期我当时也觉得它极易产生混淆所以说这个问题完全是自己潜入FORTRAN里去的并非一开始就有如果你真的想使用自然对数的基数实际有现成的函数可供利用但它们都是大写的
注意如果编译器能够正确地识别类型就不必使用尾随字符对于下述语句
long n = ;
它并不存在含混不清的地方所以后面的一个L大可省去然而对于下述语句
float f = ef; //的幂数
编译器通常会将指数作为双精度数(double)处理所以假如没有这个尾随的f就会收到一条出错提示告诉我们须用一个造型将double转换成float
转型
大家会发现假若对主数据类型执行任何算术或按位运算只要它们比int小(即charbyte或者short)那么在正式执行运算之前那些值会自动转换成int这样一来最终生成的值就是int类型所以只要把一个值赋回较小的类型就必须使用造型此外由于是将值赋回给较小的类型所以可能出现信息丢失的情况)通常表达式中最大的数据类型是决定了表达式最终结果大小的那个类型若将一个float值与一个double值相乘结果就是double如将一个int和一个long值相加则结果为long