数据类型用于对数据归类,以便开发者理解和操作。
基本数据类型
Java 确定了每种基本数据类型所占存储空间的大小,不会像其它语言那样随机器硬件架构的变化而变化,这使 Java 程序更具可移植性。
Java 中定义了如下的基本数据类型。
byte
表示整数,取值范围 -2 ^ 7 ~ 2 ^ 7 - 1,占 8 个 bit 位,1 个字节。
byte beVar = 100;
short
表示整数,取值范围 -2 ^ 15 ~ 2 ^ 15 - 1,占 16 个 bit 位,2 个字节。
short stVar = 200;
int
表示整数,取值范围 -2 ^ 31 ~ 2 ^ 31 - 1,占 32 个 bit 位,4 个字节,整数字面量的默认类型。
int itVar = 300;
long
表示整数,取值范围 -2 ^ 63 ~ 2 ^ 63 - 1,占 64 个 bit 位,8 个字节。赋值时,如果超过了 int
类型的取值范围,需要在数值后面加 L
或 l
。
// 在 int 型的取值范围内时可用,不建议,最好加上 L
long lgVar1 = 400;
// 赋值时,字面量后面要加 L 或 l
long lgVar2 = 400L;
float
表示单精度浮点数,取值范围 -3.4E ^ 38 ~ -1.4E ^ -45、1.4E ^ -45 ~ 3.4E ^ 38,E 表示以 10 为底的指数,占 32 个 bit 位,4 个字节。赋值时,需要在数值后面加 F
或 f
,因为浮点数字面量的默认类型是 double
。
不能用于表示精确值,如货币等,此时应该使用 BigDecimal
对象类型。
float ftVar = 3.14F; // 浮点数默认类型是 double,必须加 F
double
表示双精度浮点数,取值范围 -1.7E ^ 308 ~ -4.9E ^ -324、4.9E ^ -324 ~ 1.7E ^ 308,E 表示以 10 为底的指数,占 64 个 bit 位,8 个字节,浮点数字面量的默认类型。
不能用于表示精确值,如货币等,此时应该使用 BigDecimal
对象类型。
double deVar1 = 3.14;
double deVar2 = 3.14E2; // 314.0
double deVar3 = 3.14E-2; // 0.0314
char
表示单个字符,可以是中文字符,Java 内部进行字符处理时,采用 unicode 编码方式,具体编码格式是 UTF-16BE(2 或 4 个字节),取值范围 0 ~ 65535,占 16 个 bit 位,2 个字节,本质是一个无符号正整数(没有符号位),对应 unicode 编号。
char 只能表示 unicode 编号在 0 ~ 65535 的字符,超出范围的字符将使用两个 char 表示。
char 的字面量使用单引号 ''
括起来。
char crVar1 = 'A';
char crVar2 = '光';
char crVar3 = 97; // char 的本质就是无符号正整数
char crVar5 = 0x9a6c;
char crVar5 = '\u0000'; // unicode 编码
转义字符
在字符前面 \
可以改变字符原来的含义,比如 ‘\0’、‘\t’ 等。
转义字符 | 含义 |
---|---|
\n | 换行 |
\r | 回车 |
\0 | 结束字符 |
\s | 空格 |
\’ | 单引号 |
\" | 双引号 |
\\ | 反斜杠 |
\b | 退格符 |
boolean
表示真假值,取值为 true
、false
,至于占用的空间,得看 JVM 的具体实现。
void
表示无数据,用在方法上,表示没有返回值。
⭐基本数据类型转换
在 Java 中,声明变量时需要指定数据类型,JVM 会根据数据类型申请相应的内存空间,分配的空间只能存储该类型的数据。如果赋值的数据类型和声明的数据类型不一致,则需要进行数据类型转换。
boolean 类型与其他7种类型的数据都不能进行转换,char 类型不支持自动转换成它,只支持强制转换。
自动转换
自动转换是隐式的,取值范围从小到大,可以直接转换,转换时会进行扩宽(widening conversion)。因为较大的类型(如 int)要保存较小的类型(如 byte),取值范围是足够的,不需要强制转换。
强制转换
强制转换是显式的,取值范围从大到小,必须强制转换,转换时会进行缩小(narrowing conversion)。
强制转换可能会损失精度。整数类型之间相互转换,如果整数超出目标类型范围,会对目标类型的范围取余数;从浮点类型转成整数类型,会发生截尾(truncation),也就是把小数部分去掉,只留下整数部分,且如果整数部分超出目标类型范围,一样将对目标类型的范围取余数。
// 实例
long lo = 99;
int i = (int) lo;
隐式转换
/*
1、多类型混合运算时,会自动转成容量最大的数据类型,再进行计算,并返回相应类型的结果
对于整数来说,如果没有 long 型,则提升至 int 型(不管有没有 int 型变量参与)
2、在取值范围内时,整数字面量(int 型)赋值给 byte、short、char 时会自动转换
3、在取值范围内时,常量和字面量的运算结果赋值给 byte、short、char 时会自动转换,有变量时就要强转
4、赋值运算(+=、-=、...)会自动进行强转
5、`char` 的运算是按 Unicode 编号进行的,在进行算术运算时会转换为 `int` 类型
*/
byte a = 100;
// a + 1 运算提升至 int 型,值在 byte 的取值范围内,但由于是变量和字面量运算,编译时不会优化,需要手动强转
byte b = a + 1;
final byte c = 100;
// c + 1 运算提升至 int 型,值在 byte 的取值范围内,且是常量和字面量运算,编译时会优化,不需要手动强转
byte d = c + 1;
// 100 + 1 运算提升至 int 型,值在 byte 的取值范围内,且是字面量和字面量运算,编译时会优化,不需要手动强转
byte f = 100 + 1;
对象数据类型
Java 是面向对象的语言,除了基本数据类型,其他都是对象数据类型,比如字符串、数组等。
- 类:class
- 接口:interface
- 数组:[](数组有个类 Array)
对象是什么?简单来说,对象可以理解为基本数据、其它对象数据的组合。比如一个人,他的姓名是一个字符串,年龄是一个整数。
对象数据类型同样存在类型转换。