Java基础——数据类型的转换
在Java中数据类型转换可分为2种:自动转换、强制转换。
1、自动类型转换(隐式):
特点:代码不需要进行特殊处理,自动完成。
规则:数据范围从大到小(Char→Byte→short→int→long—›float→double)。
一下这些都发生了自动类型转换:
public class Demo01 {
public static void main(String[] args) {
/**
* 只要右边的变量类型的范围比左边的变量范围小都可以发生自动类型转换
* */
byte num1 = 10;
System.out.println(num1); //输出结果:10
short num2 = num1;
System.out.println(num2); //输出结果:10
int num3 = num2;
System.out.println(num3); //输出结果:10
long num4 = num3;
System.out.println(num4); //输出结果:10
float num5 = num4;
System.out.println(num5); //输出结果:10.0
double num6 = num5;
System.out.println(num6); //输出结果:10.0
}
}
2、强制类型转换(隐式):
特点:代码需要进行特殊处理,不自动完成。
格式:[数据范围小的类型] [变量名] = (数据范围小的类型)[你需要转换的数据范围大的类型]。
例如一下的例子:
public class Demo01 {
public static void main(String[] args) {
/**
* 左边是int类型,需要将long类型赋值给int类型
* long类型的数据范围比int类型大
* 不能发生自动类型转换,需要特殊处理
* 格式:[数据范围小的类型] [变量名] = (数据范围小的类型)[你需要转换的数据范围大的类型]
*/
//int num1 = 100L; //如果不进行特殊处理,这段代码直接编译器爆红,需要强转,如下:
int num1 = (int)100L; //对long类型进行了强制转换int类型,括号里面的就是你需要转换的类型
System.out.println(num1); //输出结果:100
//如果你要把浮点型的数据强制转换,可能会发生精度丢失,如下:
int num2 = (int)36.18;
System.out.println(num1); //结果为:36
//这里需要注意的是精度丢失不是四舍五入,而是直接丢弃小数点后面的数
long num3 = (long)39.9F;
System.out.println(num3); //结果为:39,而不是40
short num4 = (short)39.9;
System.out.println(num4); //结果还是39
// ......
}
}
看完数据类型的转换后,细心的人可能会发现:在上面的隐式类型装换例子中 数字10 不该是int类型吗为什么能直接给byte、short,按照隐式类型转换的规则来说:数据范围需要从大到小,这样才能进行隐式的转换,为什么int比byte、short类型都要大,却不需要进行强制的类型转换呢?
public class Demo01 {
public static void main(String[] args) {
//直接写数字默认是int,为什么给byte、short不需要强转?
byte num1 = 127;
short num2 = 32767;
/**
*这是因为:Java中规定所有整数默认是int型。
*但是只要在byte,short它们的取值范围内赋值都是可以的
*比如byte=127 就是可以的给byte=128 就不行了 因为就超出byte 127 的最大范围了。
*/
byte num3 = 128; //超过byte范围编译器直接报错
short num4 = 32768; //超过short范围编译器直接报错
}
}