3.5.1 自动类型转换
- 定义:Java 所有数值型变量可以相互转换,若系统支持将A类型的值直接赋给B类型变量,称为自动类型转换
- 表数范围小的数值或变量直接赋值给表数范围大的变量时系统会自动类型转换,否则需要强制转换
- 任何基本类型和字符串值进行连接运算时,基本类型值自动转换为字符串类型
- byte->short->int->long->float->double
- char->int
package jwz;
/**
* 基本类型的自动类型转换
*/
public class TypeConversion{
public static void main(String[] args) {
int a=6;
float f=a;//int自动转换成float类型
System.out.println(a+"\t"+f);
byte b=9;
double d=b;//byte自动转换为double
// char cc=b;//无法转换,出错->char只能和int相互转换
System.out.println(b+"\t"+d);
char c='A';
double dd=c;//char转换为int,int自动转换为double
System.out.println(c+"\t"+dd);
// String str1=d;//double不能直接赋值给String
String str=d+"_str";//与字符串连接时自动转换为字符串String
System.out.println(str);
// 结合顺序不同造成的类型转换结果不同
System.out.println("Hello"+3+4);
System.out.println(3+4+"Hello");
System.out.println("Hello"+'a'+4);
System.out.println('a'+4+"Hello");
}
}
3.5.2 强制类型转换
- 例如:
int b;short a=(short) b;
- 强制类型转换可能造成溢出,从而数据丢失
- 可通过基本类型的包装类实现将字符串转换成对应基本类型
package jwz;
/**
* 基本类型的强制类型转换
*/
public class TypeConversion{
public static void main(String[] args) {
int iValue=128; // 二进制表示形式:10000000
byte bValue=(byte)iValue;//int强制转换为byte,截断前8位,首位成为符号位,变成负数,该现象为溢出
System.out.println(bValue);
double dValue=3.98;
int dToi=(int)dValue;//double强制转换为int,取整数部分
System.out.println(dToi);
}
}
- 练习题目:网页随机验证码的实现
/**
* 网页随机验证码的实现:生成随机字符串
*/
public static void randomStr(){
String result="";
for(int i=0;i<6;i++){
// 加65转换成大写
int intValue=(int)(Math.random()*26+65);
result+=(char)intValue;
}
System.out.println(result);
}
3.5.3 表达式类型自动提升
算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。
- 所有 byte/short/char 类型提升到 int
- 整个式子类型提升到表达式中最高等级操作数的类型。
package jwz;
/**
* 表达式类型自动提升
*/
public class AutoPromote{
public static void main(String[] args) {
short sValue=5;
//表达式值自动提升为int类型,int赋值给short,出错
// sValue=(sValue-2);
// 通过强制类型转换即可赋值
sValue=(short)(sValue-2);
//byte、short、char->int;
//表达式最后结果保持表达式中最高等级类型double
byte b=40;
char c='a';
int i=23;
double d=.314;
double result=b+c+i*d;
System.out.println((int)b+"\t"+(int)c+"\t"+d+"\t"+(i*d)+"\t"+result);
}
}