当两种数据类型兼容,且转换前的数据类型的取值范围小于转换后的数据类型的取值范围,Java 会自动进行类型转换。
1.比int小的数据类型进行运算的时候 ,都提升为int类型去运算。
public class Demo {
public static void main(String[] args){
byte a = 10;
short b = 20;
//byte c = a + b; //编译报错,因为 a+b 的结果是int类型,如需要byte类型,需要强制转换运算结果
byte c = (byte) (a + b) ;
int d = a + b;
System.out.println(c + "\n" + d);
}
}
2.比 int 大的数据类型进行运算的时候, 小范围数据类型会自动转为大范围数据类型。
public class Demo {
public static void main(String[] args) {
long a = 100L;
double b = 3.14;
//long c = a + b; 报错
double c = a + b; // long类型数据与double类型数据进行运算,long类型自动转换为double类型。
System.out.println(c);
}
}
当需要将取值范围大的数据类型转换为取值范围小的数据类型,或者将不兼容的数据类型进行转换时,需要使用强制类型转换,强制类型转换可能会导致数据精度丢失。
public class Demo {
public static void main(String[] args) {
// 1. 从 double 到 int 的强制类型转换
double a = 3.142222222222;
int b = (int) a;
System.out.println("double 类型的值: " + a);
System.out.println("强制转换后的 int 类型的值: " + b);
//2. 从 byte 到 int 的强制类型转换
int c = 300;
byte d = (byte) c;
System.out.println("原始的 int 值: " + c);
System.out.println("强制转换后的 byte 值: " + d);
/*输出结果:
double 类型的值: 3.142222222222
强制转换后的 int 类型的值: 3
原始的 int 值: 300
强制转换后的 byte 值: 44
*/
}
}
1.整型强制转换精度丢失主要与取值范围(二进制转换)有关。
例如上面代码示例int转byte,转换过程如下:
int类型32bit,300二进制表示为0000 0000 0000 0000 0000 0001 0010 1100
byte类型8bit,因此int强转byte只会取低8位0010 1100,十进制表示为44
2.boolean数据类型不参与任何数据类型转换。
3.浮点型强制转换整型时,会直接舍弃小数部分。
Java 编译器会对由常量组成的表达式进行计算,并将计算结果直接替换原表达式,而不是在程序运行时再进行计算。这里的常量可以是字面常量,如0、3.14、'A'、"Java",也可以是使用final修饰的常量变量。
基本数据类型的常量表达式:当表达式中的所有操作数都是常量时,编译器会对其进行优化。
public class Demo {
public static void main(String[] args) {
byte a = 100 + 20; // 常量优化机制。
System.out.println(a);
long b= 10000000000L + 20000000000L;
System.out.println(b);
}
}
字符串常量拼接:对于字符串常量的拼接操作,编译器会在编译时将其合并为一个字符串常量。
public class Demo {
public static void main(String[] args) {
String str = "Hello" + " World";
System.out.println(str);
final String str1 = "Java";
final String str2 = " Test";
String str3 = str1 + str2;
System.out.println(str3);
}
}
基本数据类型转字符串:可以使用String.valueOf()方法或者直接使用“+”与空字符串拼接。
字符串转基本数据类型:不同的基本数据类型有对应的包装类的parseXxx()转换方法。
public class Demo {
public static void main(String[] args) {
// 1. 基本数据类型转字符串
int a = 123;
String str1 = String.valueOf(a);
String str2 = a + "";
System.out.println("int 转字符串: " + str1);
System.out.println("int 转字符串: " + str2);
// 2. 字符串转基本数据类型
String str3 = "456";
int b = Integer.parseInt(str3);
System.out.println("字符串转 int: " + b);
}
}