第06章 数据类型
1.0 数据类型
1.1 数据类型分类
1、Java的数据类型分为两大类:
基本数据类型:包括 整数、浮点数、字符、布尔。
引用数据类型:包括 字符串、数组、类、接口、Lambda。
2、基本数据类型
四类八种基本数据类型:
数据类型 | 关键字 | 内存占用 | 取值范围 | |
---|---|---|---|---|
整数型 | 字节型 | byte | 1个字节 | -128~127 |
短整型 | short | 2个字节 | -32768~32767 | |
整型 | int | 4个字节 | -2的31次方~2的31次方-1 | |
长整型 | long | 8个字节 | -2的63次方~2的63次方-1 | |
浮点型 | 单精度浮点数 | float | 4个字节 | |
双精度浮点数 | double | 8个字节 | ||
字符型 | 字符型 | char | 2个字节 | |
布尔型 | 布尔类型 | boolean | 1个字节 | true,false |
Java中的默认类型:整数类型是int 、浮点类型是double。
public static void main(String[] args) {
System.out.println(1024); // 这是一个整数 默认是int
System.out.println(3.14); // 这是一个浮点数,默认是double
}
3、注意事项
1、字符串不是基本类型,而是引用类型。
2、浮点型可能只是一个近似值,并非精确的值。
3、数据范围与字节数不一定相关,例如float数据范围比long更加广泛,但是float是4字节,long是8字节。
4、浮点数当中默认类型是double。如果一定要使用float类型,需要加上一个后缀F。
如果是整数,默认为int类型,如果一定要使用long类型,需要加上一个后缀L。推荐使用大写字母后缀。
2.0 数据类型转换
Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。
2.1 自动转换(隐式)
将取值范围小的类型自动提升为取值范围大的类型。
2.2 转换原理图解
byte类型内存占有1个字节,在和int类型运算时会提升为int类型 ,自动补充3个字节,因此计算后的结果还是int类型。
同样道理,当一个int类型变量和一个 double 变量运算时, int类型将会自动提升为double类型进行运算。
2.3 转换规则
范围小的类型向范围大的类型提升, byte、short、char运算时直接提升为int。
byte(2) short(2) char(2) --> int(4) --> long(8) --> float(4) --> double(8)
byte short char之间不能相互转换,它们参与运算会先转为int
布尔类型不能和其他类型相互转换
public static void main(String[] args) {
// 自动转换(隐式)
// 左边是long类型,右边是默认的int类型 左右不一样
// = 是赋值,将右边的int类型常量,交给左边的long类型变量存储
// int --> long 符合数据类型从小到大 这一行代码发生了自动类型转换
long num1 = 100;
System.out.println(num1); // 100
// 左边是float类型 右边是long类型
// long --> float 符合数据类型从小到大 这一行代码发生了自动类型转换
float num3 = 30L;
System.out.println(num3); // 30.0
// 左边是double类型 右边是float类型
// float --> double 符合数据类型从小到大 这一行代码发生了自动类型转换
double num2 = 2.5F;
System.out.println(num2);
}
2.4 强制转换(显式)
将取值范围大的类型强制转换成取值范围小的类型。
比较而言,自动转换是Java自动执行的,而强制转换需要我们自己手动执行。
2.5 转换格式
数据类型 变量名 = (数据类型)被转换的变量值;
2.6 转换原理图解
2.7 强烈注意
浮点转成整数,直接取消小数点,可能造成数据损失精度。
int强制转成short砍掉2个字节,可能造成数据丢失。
public static void main(String[] args) {
// 强制转换(显式)
// 左边是int类型,右边是long类型 需要强制转换
int num1 = (int)100L;
System.out.println(num1);
// long 类型转为int
int num2 = (int)6000000000L;
System.out.println(num2); // 数据溢出 1705032704
// double --> int 需要强制转换
int num3 = (int)3.99;
System.out.println(num3); // 并不是四舍五入 所有的小数位都会被舍弃
System.out.println("======================");
// 一旦char进行数学运算,那么字符会按一定的规范翻译成数字
char zifu1 = 'A';
System.out.println(zifu1 + 1); // 66
// byte short char之间不能相互转换,他们参与运算会先转为int
// byte result = num7 + num8;
// byte + byte --> int + int
byte num4 = 40;
byte num5 = 50;
int result = num4 + num5;
System.out.println(result); // 90
short num6 = 60;
short result2 = (short)(num4 + num6);
System.out.println(result2); // 100
}
2.8 常量和变量的运算
public static void main(String[] args) {
byte b1=1;
byte b2=2;
byte b3=1 + 2;
//byte b4=b1 + b2;
System.out.println(b3);
//System.out.println(b4);
}
分析: b3=1+2,1和2是常量,为固定不变的数据,在编译的时候(编译器javac),已经确定了 1+2 的结果并没 有超过byte类型的取值范围,可以赋值给变量 b3,因此 b3=1 + 2 是正确的。
反之,b4=b2+b3,b2和b3是变量,变量的值是可能变化的,在编译的时候,编译器javac不确定b2+b3的结果是什么,
因此会将结果以int类型进行处理,所以int类型不能赋值给byte类型,因此编译失败。
3.0 ASCII编码表
数字和字符对照关系表 ASCII码表
American Standard Code for Information Interchange 美国信息交换标准码
Unicode 万国码 也是数字和符号的对照关系 开头0-127跟ASCII码表一致,从128开始包含更多字符。
编码表 :就是将人类的文字和一个十进制数进行对应起来组成一张表格。
字符 | 数值 |
---|---|
0 | 48 |
9 | 57 |
A | 65 |
Z | 90 |
a | 97 |
z | 122 |
注意:
在char类型和int类型计算的过程中,char类型的字符a先查询编码表,得到97,再和1求和,结果为98。
char类型提升为了int类型。char类型内存2个字节,int类型内存4个字节。
public class DemoASCII {
public static void main(String[] args) {
char zifu1 = '1';
System.out.println(zifu1 + 0); // 49
char zifu2 = 'c';
int num = zifu2;
System.out.println(num); // 99
char zifu3 = '中';
System.out.println(zifu3 + 0); // 20013
}
}