基本类型的类型转换
自动类型转换
当把一个表数范围小的数值或变量直接赋给另一个表数范围大的变量时,系统将可以进行自动类型转换,否则就要进行强制类型转换。
自动转换示范
// 因为float的表数范围比int类型大,所以变量a和f可以自动转换
int a = 6;
float f = a;
// 因为byte的表数范围比int类型小,所以变量b和a不可以自动转换
byte b = 6;
// b = a;
// 数值类型与字符类型相互间不能自动转换,所以c与a变量不能转换
char c = 'a';
c = a;
字符串与数字相遇
数字与数字相遇会相加,与字符串相遇会连接
// 输出为:3.5
String str1 = 3.5f + "";
// 输出为:7Hello!
String str2 = 3 + 4 +"Hello!";
// 输出:Hello!34
String str3 = "Hello!" + 3 + 4;
强制类型转换
当进行强制类型转换时,类似于把一个大瓶子里的水倒入一个小瓶子,如果大瓶子里的水不多还好,但如果大瓶子里的水比小瓶子多,就会引起溢出,从而造成数据丢失。这种转换也被称为“缩小转换(Narrow Conversion)”如果被转换数据
强制类型转换的语法格式如下:
(targetType)value;
强制转换整数型数值会先把数值转换为二进制,然后按照数值类型的长度截取和转换。
例如:强制把一个int类型的值转换成byte类型的值,转换后为-23
int i1 = 233;
// b为-23
byte b = (byte)i1;
转换过程如下
可以看到byte数值的最左边是1,此处表明这是一个负数,负数在计算机里是以补码的形式存在的,将补码减1得到反码,然后再讲反码取反,就可以得到原码。
强制转换一个浮点数的时候,Java直接截断浮点数的小数部分
例如:强制把一个double类型的数值转换为int,结果为3.
double d = 3.98;
int i2 = (int)d;
利用通过数字为char类型赋值可以获取到相应字符串的方法,可以先获取指定范围数字,然后再把它们连接起来,就可以得到指定范围的字符串。
例如:获取代表小写字母的数字范围,然后获取拼接它们。
String result = "";
for (int i = 0; i < 6; i++)
{
// 生成一个97~122之间的int类型整数
// 在Ascii码或Unicode码中97到122是小写字母的范围
int intVal = (int)(Math.random() * 26 + 97);
// 将intVal强制转换为char类型后连接到result后面
result = result + (char)intVal;
}
System.out.println(result);
表达式类型的自动提升
当一个算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。规则如下:
所有的byte类型、short类型和char类型将被提升到int类型。
整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型
规则1示例,代码如下:
short sv = 5;
// 当进行计算的时候,sv变量会自动提升到int类型
// 所以sv-1这个表达式的类型是int,再次赋值给sv的时候会报错
sv = sv -1;
规则1示例,代码如下
int val = 3;
// 右边表达式中两个操作数都是int类型,故右边表达式的类型为int
// 虽然23/3不能除尽,但依然得到一个int类型整数
int intResult = 23 / val;
// 结果为7
System.out.println(intResult);
规则2示例,代码如下:
byte b = 40;
char c = 'a';
int i = 23;
double d = .314;
// 表达式b + c + i * d中,最高等级操作数为d(double类型)
// 所以右边的表达式类型提升为double
// 所以可以赋值给一个double类型
double result = b + c + i * d;
如果表达式中包含了字符串,那么它就会进行字符串连接操作,而不是计算
// "Hello"与'a'和7都进行了连接
System.out.println("Hello" + 'a' + 7);
// 'a'和7进行了计算,然后和"Hello"连接
System.out.println('a' + 7 + "Hello");