自动数据类型转换

当Java程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,这就是自动类型转换

数据类型精度大小排序图

image.png

  1. int a = 'c'; //char类型自动转换为int型,正确
  2. double b = 10; //int类型自动转换为double型,正确

自动类型转换细节

1.有多种类型的数据混合运算时,系统首先自动将所有数据转换成表达式中精度(容量)最大的那种数据类型,如果只有byte,short和char,那么所有值将被提升为int,然后再进行计算。 如果有一个操作数为long型,计算结果为long型。有一个操作数是float型,计算结果为float型。有一个操作数是double型,计算结果为double型。其余全为int型

  1. float d1 = 10 + 1.1;//10是int类型,1.1是double类型(默认),因此右边是double类型

image.png
正确写法:

  1. float d1 = 10 + 1.1F;

2.当我们把精度大的数据类型赋值给精度小的数据类型时,会报错,反之进行自动类型转换。

  1. int n2 = 1.1;//错误,double类型不能转换为int类型

但是下面讨论一个问题——byte的赋值:

  1. byte b1 = 10;

这种写法是正确的,但是10不应该是int类型吗?实际上,当把具体数赋给byte时,首先判断该数是否在byte范围内,如果是就可以赋值,然后才看的数据类型

  1. int n2 = 1; byte b2 = n2;

但是对于这种写法就会报错,因为n2是一个变量,已经分配了4字节的空间,无法转换为1字节的byte,如果是一个变量,则直接判断数据类型。
image.png
3.byte和char之间,以及short和char之间不会相互自动转换。

  1. byte b1 = 10; char c1 = b1;//错误

image.png
4.byte,short,char三者可以计算,在计算时首先转换为int类型。注意即使是byte+byte(char+char等同理)最后也是int类型。

  1. byte b1 = 10;
  2. short s1 = 20;
  3. char c1 = 30;
  4. int t1 = b1 + s1 +c1;//正确,结果为60
  5. byte b1 = 10;
  6. byte b2 = 20;
  7. byte b3 = b1 + b2;//错误,b1+b2的结果是int类型

5.boolean不参与转换。

  1. boolean pass = true;
  2. int num = pass;

image.png
6.自动提升原则:表达式结果的类型自动提升为操作数中精度最大的类型。

  1. byte b1 = 1;
  2. short s1 = 2;
  3. int t1 = 3;
  4. char c1 = 20;
  5. double d1 = b1 + s1 + t1 +c1;//正确,结果为26.0(一定带小数点)

7. 复合赋值运算符会进行类型转换

  1. byte a = 3;
  2. a += 6;//虽然6是int类型,但是使用 += 号会进行自动转换
  3. System.out.println(a);//输出结果为9

image.png

  1. byte a = 3;
  2. a = a + 6;//这样就不能进行类型转换了
  3. System.out.println(a);

image.png

强制数据类型转换

自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符(),可能造成精度 降低或溢出

  1. public static void main(String[] args){
  2. int i = (int)1.9; //精度降低
  3. int j = 2000;
  4. byte b1 = (byte)j; //精度溢出
  5. System.out.println(i); // 1
  6. System.out.print(b1); // -48
  7. }

image.png

强制类型转换细节

1.强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级。

  1. int x = (int)10*3.5 + 6*1.5; //错误,右边还是double类型
  2. int y = (int)(10*3.5 + 6*1.5); //正确,右边先计算,再强转为int类型

2.char类型可以保存int的常量值,但不能保存int的变量值,需要强转。

  1. char c1 = 100; //正确
  2. int n = 100;
  3. char c2 = n; //错误,n为int变量值
  4. char c3 = (char)n; //正确,n强转为char类型

String类型转换

1.基本类型转String类型

语法:将基本类型的值 + “” 即可。

  1. int a = 100;
  2. String b = a + "";

2.String类型转基本类型

语法:通过基本类型的包装类调用parse方法即可。

  1. String a = "12345";
  2. int b = Integer.parseInt(a);
  3. double c = Double.parseDouble(a);

image.png