Core Java (十五) Java中的类型转换

释放双眼,带上耳机,听听看~!

自动类型转换

在运行程序的时候,经常需要类型转换,Java会在以下情况下,自动做数据类型的转换。

  1. 转换前的数据类型与转换后的类型兼容。
  2. 转换后的数据类型的表示范围比转换前的类型大。

在可以转换的前提下,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

给TA打赏
共{{data.count}}人
人已打赏
安全技术

详解Node.js API系列 Crypto加密模块(1)

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索