自动类型转换
数据类型按精度(容量)大小排序:
(精度小的自动转换成精度大的)
①char--->int--->long--->folat--->double
②byte--->short--->int--->long--->folat--->double
package Java01;
public class LXS01 {
public static void main(String[] args) {
int a = 'c';
double b = 80;
System.out.println(a);//99
System.out.println(b);//80.0
}
}
(1)char 、(byte、short) 不会自动转换
package Java01;
public class LXS01 {
public static void main(String[] args) {
byte a = 10;//对(-128~127)
int b = 1;
byte a1 = b;//错,变量赋值,判断类型
char c = a;//错,byte不能自动转换成char
}
}
(2)char 、(byte、short)三者可计算,计算时首先转换int类型
package Java01;
public class LXS01 {
public static void main(String[] args) {
byte a = 1;
byte b = 2;
short c = 1;
short c1 = a + c;//错,a+c==>int
int d = a + c;//对
byte e = a + b;//错,无论单算、混算都用int
}
}
(3)boolean不参与转换
(4)自动提升原则:表达式结果的类型自动提升为操作数中最大的类型
package Java01;
public class LXS01 {
public static void main(String[] args) {
byte a = 1;
short b = 100;
int c = 1;
double d= 1.1;
float d1 = 1.1f;
double num= a+b+c+d;//对,double为最大类型
float num1= a+b+c+d1;//对,float此时为最大类型
double num2= a+b+c+d1;//对,同理
}
}
强制类型转换
自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符(),但可能造成精度降低或溢出,格外要注意。
package Java01;
public class LXS01 {
public static void main(String[] args) {
int a = (int)1.9;
System.out.println("a="+a);//a=1,==>造成精度损失
int b = 2000;
byte c = (byte)b;
System.out.println("c="+c);//c=-48,==>造成数据溢出
}
}
(1)强转符号只针对与最近的操作数有效,往往会使用小括号提升优先级
package Java01;
public class LXS01 {
public static void main(String[] args) {
int a = (int)10*3.5+6*1.5;//错
int b = (int)(10*3.5+6*1.5);//对
}
}
(2)char类型可以保存int的常量值,但不能保存int的变量值,需要强转(常量:具体的值;变量:变化的值)
package Java01;
public class LXS01 {
public static void main(String[] args) {
char a = 100;// 对
int b = 100;// 对
char c = b;// 错,int的精度比char的精度大
char c1 = (char) b;// 对,强转
System.out.println(c1);// d,100对应的字符
}
}
(3)byte和short类型在进行运算时,当做int类型处理(与上面自动转换类型的(2)对应)
补充:常量赋值的看范围,变量就要比较类型
注意:字符类型的本质是整数
package Java01;
public class LXS01 {
public static void main(String[] args) {
char a = '男';
char b = '女';
// 字符类型的本质是整数
System.out.println(a + b);//得到(男 字符码值 + 女 字符码值),52906
}
}