自动类型转换
在运行程序的时候,经常需要类型转换,Java会在以下情况下,自动做数据类型的转换。
- 转换前的数据类型与转换后的类型兼容。
- 转换后的数据类型的表示范围比转换前的类型大。
在可以转换的前提下,a->b,即使b的表示范围大于a的表示范围,但如果b的精度不够,则最终的结果会丧失一些精度。
以下转换不会丧失精度:
byte->short
short->int
char->int
int->long
int->double
float->double
而以下可能会有精度损失:
int->float
long->float
long->double
总之,int->long->float->double,即
向上转型,java会默认成功,不过可能会
有精度的丢失;但是向下转型,要进行强制转换,而且还会有精度的丢失。
当不同数据类型的两个数进行运算的时候,可能会发生自动的类型转换,将两个数都转换成相同的类型,然后再进行运算。需要注意的是,这种转换不会对运算的两个数的类型产生影响。如下例中,int类型的i与float类型的f进行加法运算,首先,i会转换成float类型,与f相加得到一个float类型的结果,然后再转换成double类型,赋给d。赋值结束后i与f的数据类型不会改变。
若是整数的类型为short或byte,为了避免溢出,Java会将表达式中的short和byte类型自动转换成int类型,即可保证其运算结果的正确性,这也是Java所提供的“扩大转换”功能。如下例中,byte类型的a和b进行运算,Java会将其统统转换成int类型再进行运算,如果赋值给byte c 将会引起编译错误。
要注意的是,当相同数据类型的数进行运算的时候,赋值的类型不足以表示得数,
不会发生自动的类型转换,比如两个int类型的数相加,得数用int不足以表示,那么就会发生编译错误。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 1package com.xujin;
2
3public class Test{
4 public static void main(String...arg){
5 int i = 2000;
6 float f = 200f;
7 double d = i + f;
8 System.out.println(d);
9
10 byte a = 10;
11 byte b = 90;
12 //byte c = a + b;//Type mismatch: cannot convert from int to byte
13 int c = a + b;
14 System.out.println(c);
15
16 //int e = 2147483648;//The literal 2147483648 of type int is out of
17 }
18}
19
强制类型转换
语法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13 1package com.xujin;
2
3public class Test{
4 public static void main(String...arg){
5 double x = -9.99;
6 int y = (int)x;//-9,直接砍掉小数
7 int z = (int)Math.round(x);//-10,得到的是最接近的整数
8 System.out.println(y);
9 System.out.println(z);
10 }
11
12}
13
重载时的自动类型转换
在函数重载的时候,也会出现自动类型转换的情况。
比如,有这个方法method(long a, float b),当调用method(10, 10)而没有method(int a, int b)的时候,整型10会自动转换成long类型。实现函数的重载。Java在选择重载函数的时候会调用最匹配的方法。
如下例:
10会首先转换成long类型,只有遇到强制转换的时候或者说方法里面只有method(floata, float b)才转换成float类型。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 1package com.xujin;
2
3public class Test{
4 public static void main(String...arg){
5 Test test = new Test();
6 test.med(10, 10);//2
7 test.med(10, (float)10);//3
8 test.med((float)10, 10);//1
9 }
10 public void med(float a, long b){
11 System.out.println("1");
12 }
13 public void med(long a, long b){
14 System.out.println("2");
15 }
16 public void med(long a, float b){
17 System.out.println("3");
18 }
19}
20