定义
计算机中数值的存储方式,设定数值存储单元的存储位置,存储长度和存储形式
分类
根据存储方式分类
类型 | 占用字节数 | 表示范围 |
---|---|---|
byte | 1 | -128~127 |
short | 2 | − 2 15 -2^{15} −215~$2^{15}-1 $ |
int | 4 | − 2 31 -2^{31} −231~$2^{31}-1 $ |
long | 8 | − 2 63 -2^{63} −263~$2^{63}-1 $ |
float | 4 | -3.403e38~3.403e38 |
double | 8 | -1.798e308~1.798e308 |
根据存储位置分类
常量
值不能改变的量,编译时就能确定大小
定义方式:
- 直接量:
1(int)、1.0(double)、true(boolean)、‘1’(char)、“1”(字符串)、null(引用型)
null
:
引用类型的默认值,不可以赋给基本类型变量
表示引用的地址没有生成,≠"",""表示引用有地址,但是地址指向的对象为空 - 符号常量:
符号常量:final int CON_QUA = 1; //常量名必须大写;
赋值:因为常量值不能改变,所以定义时就必须赋初值,即使作为成员常量也是一样(不能靠计算机去分配)
变量
值不确定,编译时不验证值的大小,只验证语法规范
定义方式:
- int varValue = 1; //变量名习惯开头用小写
使用:
- 变量必须先被赋值过(包括系统默认赋值),才能使用,否则出错(不赋值就使用时无意义的)
分类:
- 成员变量:类中定义,存在堆中,垃圾回收机制进行回收
1)类变量:static修饰,存在类名指向的静态方法区内存
2)实例变量:无static修饰,存在于对象名指向的堆内存 - 局部变量:函数中定义,存在栈中,无需垃圾回收机制,随方法或代码块结束而结束
1)形参
2)方法局部变量
3)代码块局部变量
类型转换
自动类型转换:
低等级的数据类型转换为高类型的数据类型(可能存在精度损失)
- 规则:
1、引用类型向上转型,子类引用赋值给父类引用(父类引用指向子类对象)
2、基本类型和字符串进行连接运算时,基本类型的值将自动转换为字符串类型
3、基本类型之间运算时,若类型不一,则低等数据类型先自动转换,再运算
特例:
short、char、byte型变量在运算时总会自动提升为int型变量
byte x=1; //正确,编译器可以判断未越界,无需强转
byte y=x; //正确,编译器能确定不会越界
byte y=x+1; //错误,byte型参与运算自动提升为int型,发生越界
byte z=x+y; //错误,byte型参与运算自动提升为int型,发生越界
final byte a=1;
final byte b=2;
byte c=a+b; //正确,虽然由于参与运算自动提升为int型,但因为a和b都是常量,编译器可以判断未越界
强制类型转换:
高等级的数据类型转换为低等级的数据类型
- 类型显式强转:
- 常量:
只有9L和9F两种形式,并且L只能放在整数常量前 - 变量:
- 基本类型
除boolean类型外,通过()进行强制转换(boolean类型不能强转) - 引用类型的强转:
1、只发生在具有继承关系的子父类型之间,即父类引用强制转换为子类引用(向下转型)
2、父类引用强转之前,指向的对象必须是强转子类引用的对象或其子类对象,否则运行报错
3、对于转型:自始至终都是子类对象在做着类型的变化
- 特例:
整形常量(int型)在不超越对应低级类型的可取值范围时,可以直接赋值,无需强制类型转换
—编译器可以检查常量是否满足范围要求,但是不能检查变量
bytex=1;//正确 - 赋值运算符+=-=*=/=+±-等,会将左右两边的运算结果进行强制类型转换为左边变量类型
如:bytex=0;
x=x+3;//报错,byte型x在进行运算时,由于和整形3进行相加,类型提升为整形,且右边含有变量,运算结果为整形变量,可能发生越界错误
x+=3;//等效于x=(byte)(x+3);正确
参考文献
https://blog.csdn.net/qwe969153746/article/details/53353534 Java基本数据类型