常量与变量
常量
字面常量 | 整型常量 | 123、33 | | —- | —- | | 实型常量 | 3.1415926 | | 字符常量 | ‘a’ | | 逻辑常量 | true\false | | 字符串常量 | ‘hello world’ |
字符常量
一个变量被final修饰,这个变量就变成了一个常量,这个常量的值就不可以更改了,这个常量就是我们所说的字符常量,约定俗称的规定:字符常量的名字全部大写
变量
变量本质上是代表一个可操作的存储空间,空间位置确定,存储的值不确定,我们通过变量名访问对应的存储空间。
变量声明
如果你只定义一个变量,而没有给变量赋值,反编译后会发现这个变量其实没有定义。因此变量只声明而不初始化直接使用会导致错误
变量内存
package com.pai.variable;//分析变量的内存public class Memory {public static void main(String[] args) {int a = 10;int b = 20;int c = a+b;}}
反编译
public class com.pai.variable.Memory {public com.pai.variable.Memory();Code:0: aload_01: invokespecial #1 // Method java/lang/Object."<init>":()V4: returnpublic static void main(java.lang.String[]);Code:0: bipush 102: istore_13: bipush 205: istore_26: iload_17: iload_28: iadd9: istore_310: return}
变量的作用域
| 基本数据类型 | 字节数 | 表示范围 | 注意点 |
|---|---|---|---|
| byte | 1/8bit | -2^7~2^7-1 | |
| short | 2/16bit | -2^15~2^15-1(-32768~32767) | |
| int | 4/32bit | -2^31~2^31-1(-2147483648~2147483647约21亿) | |
| long | 8/64bit | -2^63~2^63-1 | |
| float | 4/32bit 其中1bit符号位,8bits指数位,23bits的尾数位 精度约为小数点后6-8位左右 |
1. 默认的字面量为double,所以字面量会产生由大到小的精度丢失的问题,所以要在字面量后加f或F表示float类型 1. 不要尝试比较float和double,因为底层存储精度不一样,0.3f==0.3d是false |
|
| double | 8/64bit 其中,1bit符号位,11bits指数位,52bits的尾数位 精度约为小数点后15-16位左右 |
根据IEEE 754浮点“双井高度格式”位的布局,第63位标识浮点数的符号,62-52位表示指数,第51-0位标识浮点数的有效数字(尾数) | 1. 使用double存储会产生丢失精度的问题,所以避免使用double |
| char | 2/16bit | ||
| boolean | 1/8bit |
浮点类型
浮点类型常量
- 十进制表示形式: 180.5
- 科学计数法: 314e-2
浮点类型变量
float f = 8.5f;
- 8.5对应的二进制为 1000.1(8 4 2 1 2^-1)
- 计算符号位:因为是正数所以符号位为0
- 计算指数位:规范化表示小数点左侧只能由一位并且为1,所以上述1000.1应表示为1.0001*2^3,规定指数位的底为2且幂数要加127(这样便可以使用0~255表示-127~128的有符号值,具体参考这篇博客),因此指数位的值为130,转换为二进制为1000 0010
- 计算尾数位:规定尾数为要去掉规范化后的小数点前面的1,只保留小数部分,因此1.0001*2^3尾数位为0001
- 最终得到完整的浮点数为 0 1000 0010 0001 0000 0000 0000 0000 000
数据类型转换
常见类型转换会发生什么?
int->double
double a = 6;//6.0
double->int
int i = 6.5;//精度损失,报错int j = (int)6.5;//6,不存在四舍五入,直接舍弃小数点后的内容
多种数据类型参与运算
多种数据类型参数运算时,整数类型、浮点类型、字符类型都可以参与运算,唯独布尔类型不可以参与运算
类型级别
byte\short\char ——> int ——> long ——> float ——> double
当一个表达式中有多种数据类型参与运算时,要找出当前表达式中级别最高的类型,然后其余的类型都转换为当前表达式中级别最高的类型进行计算。

