八大基本类型
数据类型 | 关键字 | 包装类 | 内存占用 | 范围 |
字节型 | byte | Byte | 1字节 | -128 ~ 127 |
短整型 | short | Short | 2字节 | -32768 ~ 32767 |
整型 | int | Integer | 4字节 | -2^31~2^31-1 |
长整型 | long | Long | 8字节 | -2^63~2^63-1 |
单精度浮点数 | float | Float | 4字节 | |
双精度浮点数 | double | Double | 8字节 | |
字符型 | char | Character | 2字节 | 0 ~ 65535 |
布尔型 | boolean | Boolean | true和false |
只有int和char类型的包装类拼写比较特殊,其他的包装类都是首字母要大写即可。
字面量
10 // int 字面值常量(十进制)
010 // int 字面值常量(八进制) 由数字 0 开头. 010 也就是十进制的 8
0x10 // int 字面值常量(十六进制) 由数字 0x 开头. 0x10 也就是十进制的 16
10L // long 字面值常量. 也可以写作 10l (小写的L)
1.0 // double 字面值常量. 也可以写作 1.0d 或者 1.0D
1.5e2 // double 字面值常量. 科学计数法表示. 相当于 1.5 * 10^2
1.0f // float 字面值常量, 也可以写作 1.0F
true // boolen 字面值常量, 同样的还有 false
'a' // char 字面值常量, 单引号中只能有一个字符
"abc" // String 字面值常量, 双引号中可以有多个字符.
数据类型之间的相互转换
boolean型可以转化为String
boolean a = true;
String b = "运算结果:" + a;
System.out.println(b);
小类型转换为大类型
int a = 10;
//隐藏的类型转换
//整型字面量默认是int,这里:int ——> long
long b = 20;
//long变量赋值给int变量 大类型赋值给小类型
a = b; //这里会报错
b = a;
这里a是一个整型,b是long类型,现在把一个long类型的变量赋值给int类型可能会导致整型变量放不下b的值。
int a = Integer.MAX_VALUE;
long b = a + 1;
System.out.println(b);
程序执行代码都是从右向左执行
a(int) + 1(int) = int + int = int
显示a + 1 --> 已经溢出,把一个溢出的值给 long型的b接受,所以并不是long放不下,是存放的就是一个溢出的值。
但是可以先把小类型提升为大类型在运算就不会出现上述情况:
int a = Integer.MAX_VALUE;
long b = a + 1L;
System.out.println(b);
大类型转换为小类型
int a = 1;
double b = 2;
//c = 0.5
double c = a / b;
// double --> int
int d = (int) c;
System.out.println(d);
数据类型转换中有一些特殊规则(坑)
1.小于4字节的数据类型
在计算机底层,对于数值型和字符型来说,小于4字节的数据类型(byte,shirt,char),在CPU读写数据时会统一提升为4字节。eg.byte类型在存储时会转为int类型。
byte c = a + b ---> byte c = int + int
当把byte类型保存区间之内的整数赋值给byte时,可以直接赋值,超出byte的范围需要强制类型转换
int a = 120;
byte b = a; // 这里报错
System.out.println(a);
当把一个int类型变量赋值给byte时,无论是否超出存储范围,都需要强转。
2.final关键字修饰时
final byte a = 10;
final byte b = 20;
byte c = a + b;
System.out.println(c);
被final修饰的变量除了数据值不能改,类型也不能提升
final byte a = 10; 存储时,仍然是byte类型。
3.字符型和整型相互转换
char字符会按照不同的编码规则转为int存储,eg.ASCII