11. 数据类型转换
大约 6 分钟
title: 数据类型转换
在赋值运算或算术运算时,要求数据类型相同,否则就要进行类型转换。
转换的方式:
自动类型转换(隐式)
强制类型转换(显示)
**基本数据类型的转换主要包含:**byte、short、int、long、float、double和char,不包含boolean类型。
1. 自动类型转换
自动类型转换(隐式类型转换)指的是容量小的数据类型可以自动转换为容量大的数据类型。
由低字节向高字节的转换 byte->short-> char –>int->long->float->double
赋值运算中的类型转换案例
public static void main(String[] args) {
// 把int类型的值赋值给double数据类型(符合低字节向高字节转换)
double num = 32;
// 把整数常量赋值给byte、 short和char类型变量(不符合低字节向高字节转换)
byte b = 123;
short s = 123;
byte by = 1234; // 错误,整数常量不能操出其类型的表数范围
}
把整数常量(int类型)赋值给byte、short和char类型变量,属于自动类型转换的特例,只要不超出其表数范围即可。
算数运算中的类型自动转换原则: 如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型,结果为double类型。 否则,如果其中一个操作数是float类型,另一个将会转换为float类型,结果为float类型。 否则,如果其中一个操作数是long类型,另一个会转换为long类型,结果为long类型。 否则,两个操作数都转换为int类型,结果为int类型。
算数运算中的类型转换案例
public static void main(String[] args) {
int num1 = 5; // int类型
double num2 = 7.34; // double类型
// 此处的num1会被提升为double类型
double sum = num1 + num2; // num1和num2的和为double类型
}
/*
1.为什么需要学习数据类型的转换???
因为Java是强类型的语言,因此参与“赋值运算”和“算数运算”的时候,要求参与运算的数据类型必须保持一致,否则就需要做数据类型转换。
2.基本数据类型转换的方式有哪些???
a)隐式类型转换(自动)
b)强制类型转换(手动)
3.哪些基本数据类型可以相互转换???
除了boolean类型之外,其余的基本数据类型都可以相互转换!
4.
*/
/*隐式类型转换(自动)???
原则:低字节向高字节自动提升。
byte --> short --> int --> long --> float --> double
char --> int
赋值运算
原则:低字节向高字节自动提升。
特例:把int类型的常量,赋值给byte、short和char类型的变量或final修饰的常量时,则就属于隐式类型转换的特例,
只需赋值的数据没有超出其数据类型的表示范围即可。
--> 赋值的数据应该是什么???赋值的数据应该是int类型的常量!
--> 赋值数据的大小是什么???赋值数据的大小不能超出其数据类型的表示范围。
算数运算
原则:两个操作数做运算,如果其中一个操作数为double类型,则另外一个操作数也会隐式转化为double类型,最终计算结果就是double类型;
否则,如果其中一个操作数为float类型,则另外一个操作数也会隐式转化为float类型,最终计算结果就是float类型;
否则,如果其中一个操作数为long类型,则另外一个操作数也会隐式转化为long类型,最终计算结果就是long类型;
否则,这两个操作数都会隐式转化为int类型,最终计算的结果就是int类型。
*/
public class DataTypeDemo02 {
public static void main(String[] args) {
byte num1 = 123;
int num2 = 100;
int sum = num1 + num2;
System.out.println(sum); // 输出:223
/*
byte num = 123;
// 此处num会从byte类型隐式转化为int类型,最终运算的结果就是int类型
int sum = 100 + num;
System.out.println(sum); // 输出:223
*/
/*
// 此处100会从int类型隐式转化为long类型,最终运算的结果就是long类型
long sum = 100 + 123L;
System.out.println(sum); // 输出:223
*/
/*
// 此处100会从int类型隐式转化为float类型,最终运算的结果就是float类型
float sum = 100 + 3.14F;
System.out.println(sum); // 输出:103.14
*/
/*
// 此处100会从int类型隐式转化为double,最终运算的结果就是double类型
double sum = 100 + 3.14;
System.out.println(sum); // 输出:103.14
*/
/*
byte num = 127; // 特例
System.out.println(num); // 输出:127
*/
/*
int num = 100;
// 此处num会从int类型隐式转化为long类型,然后再做赋值操作
long result = num;
System.out.println(result); // 输出:100
*/
/*
// 此处100会从int类型隐式转化为double类型,然后再做赋值操作
double num = 100;
System.out.println(num); // 输出:100.0
*/
/*
// 此处'a'会从char类型隐式转化为int类型,然后再做赋值操作
int num = 'a';
System.out.println(num); // 输出:97
*/
}
}
package 数据类型的转换.隐式类型的转换;
public class DataTypeTransform {
public static void main(String[] args) {
final byte v1 = 5;
final short v2 = 5;
final char v3 = 97;
//int v4 = 100;
//final byte v5 = v4;//报错:Type mismatch: cannot convert from int to byte
final int v6 = 100;
final byte v7 = v6;
System.out.println("v7="+v7);
final byte v8 = 127;
//final byte v9 = 128;//报错:超出了byte的精度范围
System.out.println("v1=" + v1);
System.out.println("v2=" + v2);
System.out.println("v3=" + v3);
}
}
2. 强制类型转换
强制类型转换(显示类型转换),主要用于显式的转换一个数值的类型。在有可能丢失信息的情况下进行的转换是通过造型来完成的,但可能造成精度降低或溢出。 语法格式:目标类型 变量 =(目标类型)源类型变量或常量
【示例】
public static void main(String[] args) {
float a = 123.23f;
byte b = (byte)a; // 注意:强转之后有可能会丢失精度
System.out.println(b); // 输出:123
// 注意:原类型数据被强转后数据是不会变化。
System.out.println(a); // 输出:123.23
}
使用强制类型转换的时候,一定要明确需要强转的数据。
自动装箱与拆箱
- 装箱:将基本类型用它们对应的引用类型包装起来;
- 拆箱:将包装类型转换为基本数据类型;
举例:
Integer i = 10; //装箱
int n = i; //拆箱
装箱其实就是调用了 包装类的valueOf()
方法,拆箱其实就是调用了 xxxValue()
方法。
因此,
Integer i = 10
等价于Integer i = Integer.valueOf(10)
int n = i
等价于int n = i.intValue()
;
注意:如果频繁拆装箱的话,也会严重影响系统的性能。我们应该尽量避免不必要的拆装箱操作。
private static long sum() {
// 应该使用 long 而不是 Long
Long sum = 0L;
for (long i = 0; i <= Integer.MAX_VALUE; i++)
sum += i;
return sum;
}