变量和类型转换
# 变量和类型转换
# 变量的概念
变量是内存中的一个存储区域,该区域有自己的名称(变量名)和类型(数据类型),该区域的数据可以在同一类型范围内不断变化。也就是说定义的变量可以用来不断的存放统一类型的常量,并可以重复使用。可以理解将变量理解成数学中的未知数。
定义变量的格式:数据类型 变量名 = 初始化值;
# 数据类型
在定义变量的时候,需要声明变量是属于那种数据类型。而Java是强语言类型,对于每一种数据都定义了明确且具体的数据类型,在内存中分配了不同的内存空间。Java数据类型分为两大类:
基本数据类型
- 数值型
- 整数类型(byte,short,int,long)
- 浮点类型(float,double)
- 字符型(char)
- 布尔型(boolean)
- 数值型
引用数据类型
类(class)
接口(interface)
数组([])
其中整数类型默认为int,浮点类型默认为double。因为这个机制,在定义和使用变量的时候会出现自动类型提升的现象。
基本数据类型使用的字节以及取值范围:
byte:1字节,-128 ~ 127
shor: 2字节,-2^15 ~ 2^15-1
int:4字节,-2^31~2 ^31-1 (上亿)
long: 8字节,略
float:4字节,略
double:8字节,略
char:2字节
Boolean:true或者false
# 注意事项
- 确定使用变量的作用域(一对{}之间有效),避免超出范围
- 初始化值,避免自动类型提升(尽管某些智能开发工具,会提示初始化值无意义,但是还是尽量养成初始化值的习惯)
# 应用场景
当数据不确定的时候。需要对数据进行存储时,就定义一个变量来完成存储动作。
# 类型提升&强制转换
类型转换是指将某种数据类型转换为另一种数据类型。类型转换分为两种:
- 自动类型转换(隐式类型转换)
- 强制类型转换(显式类型转换)
类型转换的原理:
类型转换操作在寄存器中完成。
转换以占用内存大的类型为主。小数据往大数据转换,数据保持完整,大数据往小数据转换,数据精度会损失。
负数会将以前的空位进行零填充。
表达式中数据类型自动提升:
- 所有的byte类型、short类型和char的值将被提升到int类型。
- 如果一个操作数是long类型,计算结果就是long类型。
- 如果一个操作数是float类型,计算结果就是float类型。
- 如果一个操作数是double类型,计算结果就是double类型。
自动类型提升的例子:
int x = 3;
byte y = 4;
x = x + y;
x是占用4个字节的整型变量,而y是占用1个字节的字节型变量,在进行相加运算的时候,计算机会将y变量进行自动类型转换,将y提升为占用4个字节的整型变量,最后x+y进行相加的结果也是个整型,这样就可以赋值给x变量。
自动类型提升失败的例子:
byte y = 4;
y = 3 + y;
上述代码在编译时期就会报错,因为3在Java中默认为int类型,而y被自动提升为整型,3 + y 语句计算结果为整型,整性是不可以赋值给byte类型的。当然你也可以进行强制类型转换:
y = (byte)(3 + y);
如上,强制类型转换只需要使用括号将要强制转换类型括起来即可。但是强制类型转换是比较危险的,容易丢失数据,因为强转就是将一些位强行砍掉。示例中的计算结果是正确的,那是因为砍掉之后的位刚好等于正确的结果:
00000000 00000000 00000000 0000 0111
强转后:
0111 = 7