数据类型
- 一、数据类型
- 1.八大基本数据类型
- 二、变量
- 0.字面常量
- 1.变量
- 1)数值类型
- a.整型
- b.浮点型
- 2)字符类型(char)
- 3)布尔类型(boolean)
- 2.类型转换
- 3.类型提升
一、数据类型
Java是一种强类型编程语言,在声明变量时必须明确指出其数据类型,否则会发生编译错误!我们知道Java是一种面向对象的编程语言,所以相比C语言所拥有的基本数据类型,Java拥有另一种数据类型:引用数据类型,即Java的数据类型可分为以下两大类:
- 8大基本数据类型;
- 引用数据类型;
下面对这些数据类型进行进一步说明,对其特性和占用空间的大小进行说明:
1.八大基本数据类型
数据类型 | 关键字 | 内存占用 | 范围 | 默认值 | 包装类 |
---|---|---|---|---|---|
字节型 | byte | 1字节 | -27~27-1 | 0 | Byte |
短整型 | short | 2字节 | -215~215-1 | 0 | Short |
整型 | int | 4字节 | -231~231-1 | 0 | Integer |
长整型 | long | 8字节 | -263~263-1 | 0 | Long |
单精度浮点型 | float | 4字节 | 有具体范围,但整数和小数部分分开存。通常是一个近似值,并不是精确值,小数点后6位只能保证准确 | 0.0 | Float |
双精度浮点型 | double | 8字节 | 有具体范围,但整数和小数部分分开存。通常是一个近似值,并不是精确值,小数点后12位只能保证准确 | 0.0 | Double |
字符型 | char | 2字节 | 0~2^16-1 | ‘\u0000’(遵循Unicode编码规则) | Character |
布尔型 | boolean | JVM没有明确规定,1字节/4字节/1比特均有可能 | 只有true、false两种情况 | false | Boolean |
这里需要额外注意几点:
- Java中的整型数据类型只考虑有符号整数,所以其数据范围为:-2n-1~2n-1-1,n表示该数据类型所占内存的大小,单位为字节;
- 对于字面常量,整型默认为int,浮点数默认为double;
- 只有类中的属性,其对应数据类型才有默认值,方法中的局部变量是没有默认值的,使用前必须对其赋值。引用数据类型的默认值为null;
- 字符型(char)类型遵循Unicode编码规则,其范围为’\u0000’~‘\uFFFF’(十六进制表示);
二、变量
0.字面常量
- 常量是指程序运行期间,固定不变的量;
- 字面常量是指伴随明确数据类型的常量,比如3,“hello”,'A’等。字面常量根据其数据类型有以下分类:
1.变量
程序运行期间可能发生变化的量称为变量,通过上面提到的两大类数据类型指定其数据类型。
声明变量的方式:
数据类型 变量名=初始值;
- 如果该变量作为某类的属性出现,可以在声明变量时不指定初始值,此时该变量具有数据类型相应的默认值,比如int类型默认值为0。
- 同一行可以声明多个相同数据类型的变量,比如int a=10,b=20,c;
- 每种数据类型都有自己可表示的数据范围,如果超出其数据范围,会发生数据溢出现象,此时可对其数据类型进行提升或者直接使用数据范围更大的数据类型,比如int和long的使用;
如此也说明变量的分类与数据类型的不同有关:
1)数值类型
a.整型
(1)byte类型
- 常用于网络编程或IO编程方面,因为数据流基本单位为字节,而计算机表示空间大小的基本单位也是字节;
- 其数据范围为-128~127;
举例:
byte x=10;
(2)short类型
- 该类型数据范围太小,应用场景有限,作为了解即可;
举例:
short x=128;
(3)int类型
- 整型字面常量默认数据类型即为int类型,其默认值为0;
举例:
方式一:int a=127;
方式二:int a;
a=127;
(4)long类型
- 整型类型中数据范围最大的数据类型,通常可以满足工程应用中的需求;
- 需要注意整型字面常量默认数据类型即为int类型,所以声明long型变量时,为了进行区分,通常在常量后面加l或L;
- 推荐在常量后面加L,因为小写l和数字1容易混淆;
举例:
方式一:long a=127l;
方式二(推荐):int a=127L;
b.浮点型
(1)float类型
- 单精度浮点型,精度保证范围为小数点后6位之内,精度差,应用场景有限;
- 浮点型字面常量默认为double数据类型,因此为与double进行区分,声明float型变量时通常在常量后面加f或F;
举例:
方式一:float a=127.1f;
方式二:float a=127.1F;
(2)double类型
- 双精度浮点型,精度保证范围为小数点后12位之内,精度高,基本满足工程应用;
- 浮点型字面常量默认为double数据类型,默认值为0.0;
举例:
double a=127.1;
2)字符类型(char)
- 使用单引号将字母包裹起来,表示字符型字面常量;
- 默认值为’\u0000’;
- 本质存储的是整数,该整数为Unicode编码集中当前字符对应的“码点”,比如’a’对应97;
举例:
char ch='a';
3)布尔类型(boolean)
- boolean类型只有true和false两种取值,这与C语言有显著区别;
- boolean类型不能与其他数据类型进行类型转换操作;
- 默认值为false;
举例:
boolean flag=true;
2.类型转换
最开始提到说Java是一种强类型语言,所以当不同数据类型之间互相赋值的时候,我们需要进行合适的类型转换工作,否则会发生编译错误!
Java中的类型转换分为以下两类:
- 大类型->小类型,强制类型转换(显式);
- 小类型->大类型,自动类型转换(隐式);
需要注意的点:
- 注意这里说的“大”、“小”指的是数据类型所表示数据范围的大小;
- 大类型强制类型转换为小类型时,会发生精度丢失的问题,比如double类转int类;
3.类型提升
- 不同数据类型进行相互运算并存在相互赋值时,小类型会隐式提升为大类型;
- 这里需要特别注意的是byte、short、char三种数据类型与int数据类型之间的类型提升问题:
(1)byte、short、char占用内存大小分别为1字节、2字节、2字节,但实际参与运算时会将他们隐式提升为4字节int类型进行运算;
举例1:
int a=10;
long b=20L;
int c=a+b; // 此时a的类型被隐式提升为long,long+long=long,然后将long赋值给int但未进行强制类型转换会发生编译报错
long d=a+b; // 此时可顺利运行
举例2:
byte a=10;
byte b=20;
byte c=a+b; // 此时a、b的类型被隐式提升为int,int+int=int,然后将int赋值给byte但未进行强制类型转换会发生编译报错
int d=a+b; // 此时可顺利运行