- 隐式类型转换:
- 规则:
- 强制类型转换:
- 情况:
- 类型转换注意事项:
byte < short = char < int < long < float < double
boolean不参与转换
System.out.println('a' + 0);//a是char类型 要向int类型转换
隐式类型转换:
小范围数据类型转换为大范围数据类型。
不同的数据类型之间不能进行运算,只有转化为同一种类型才可以进行运算。
1.比int小的都转化为int
class Demo {
public static void main(String[] args){
byte a = 10;
short b = 20;
byte c = a + b; //编译报错 因为a+b的结果是int类型 大类型无法向小类型进行转换
byte c = (byte) (a + b) ;//可以强制类型转换
System.out.println(c);
}
}
2.比int大的数据类型进行转换时,小范围数据类型会自动转为大范围数据类型
public class Demo {
public static void main(String[] args) {
long lo = 100L;
double d = 3.14;
int a = lo +d; // 编译报错 long和double运算 long会自动转double
double dou = lo +d;
System.out.println(dou);
long lon = (long) (lo + d);
System.out.println(lon);
}
}
强制类型转换:
大范围数据类型强制转为小范围数据类型
情况:1.大转小,大超小的范围,转过去之后数据发生改变,意义不大
int a = 200; byte b = (byte)a; // 强制类型转换 System.out.println(b); // -56
2.大转小,大未超过小的范围,转过去之后数据不发生改变
int c = 100; byte d = (byte)c; // 意义所在 System.out.println(d); //100
3.浮点数转整数:
切掉小数部分
double dou = 3.14; int i = (int)dou; //意义所在 System.out.println(i);//3类型转换注意事项:
1.boolean不参与任何类型转换
boolean b = true; int c = b; //编译报错 int a = (int)b; //编译报错 System.out.println(a);
2.常量优化机制(基本类型中只有比int小的数据才有常量优化)
常量优化是为了小数据类的快捷运算
public class Demo {
public static void main(String[] args) {
System.out.println(100); // 默认是 int 类型 4个字节。
byte b = 100; // 正确的。 100虽然是int的 但是他是一个常量数据。 常量优化机制
//底层 其实是这样的 byte b = (byte)100;
int a = 100;
byte c = a; //错误的 因为a是变量 只有常量才有 常量优化机制。
byte d = 80 + 20; //正确的 常量优化
// 常量的运算 在编译成class文件的时候, 就已经把 80+20 变成了100
// 也就是说 等这句话 编译到了class文件的时候 就变成了 byte d = 100; 就又符合常量优化机制了。
//大的数据类型是在运行的时候完成运算,所以没有常量优化
byte e = 80;
byte f = e+20; // 编译报错 e是变量
// 以上的特点 ---演示的都是 比int小的 基本类型常量。
// 在基本类型里面 只有 比int小的数据 才遵循常量优化机制。 比int大的没有。
System.out.println(3.14); // 默认是double类型
float flo = 3.14; // 编译报错 double转float 报错。 比int大的没有常量优化机制。
// 所以我们为了在 一个 小数常量的时候 告诉jvm 我这个小数常量 不再是默认是 double类型了 所以 我们就在小数后面加一个 F
System.out.println(3.14F); // 是float类型
float flo = 3.14F;
System.out.println(b);
}
}
- ps
byte d = 10; d += 5; System.out.println(d);//不报错 为15,+=底层自带强制类型转换
int e = 10; int f = e+=1;//不报错,先算表达式的结果,表达式都是有结果的
3.long类型要在数据结尾加L
public class Demo12 {
public static void main(String[] args) {
int a = 100;
long lo = a;
System.out.println(lo);
long lo = 100;
System.out.println(lo);
System.out.println(10000); //默认是int类型 int类型的范围 21亿
//System.out.println(10000000000); //100亿
// 所以 我们此时 就想 写一个 比21亿大的数据
// 你需要告诉jvm 我现在写的这个数 不再是 int类型的 而是long类型 你怎么告诉jvm 你只需要在后面加一个 L 就告诉他了。
System.out.println(10000000000L);
}
}



