常量与变量

常量

  1. 字面常量 | 整型常量 | 123、33 | | —- | —- | | 实型常量 | 3.1415926 | | 字符常量 | ‘a’ | | 逻辑常量 | true\false | | 字符串常量 | ‘hello world’ |

  2. 字符常量

一个变量被final修饰,这个变量就变成了一个常量,这个常量的值就不可以更改了,这个常量就是我们所说的字符常量,约定俗称的规定:字符常量的名字全部大写

变量

变量本质上是代表一个可操作的存储空间,空间位置确定,存储的值不确定,我们通过变量名访问对应的存储空间。

变量声明

如果你只定义一个变量,而没有给变量赋值,反编译后会发现这个变量其实没有定义。因此变量只声明而不初始化直接使用会导致错误

变量内存

  1. package com.pai.variable;
  2. //分析变量的内存
  3. public class Memory {
  4. public static void main(String[] args) {
  5. int a = 10;
  6. int b = 20;
  7. int c = a+b;
  8. }
  9. }

反编译

  1. public class com.pai.variable.Memory {
  2. public com.pai.variable.Memory();
  3. Code:
  4. 0: aload_0
  5. 1: invokespecial #1 // Method java/lang/Object."<init>":()V
  6. 4: return
  7. public static void main(java.lang.String[]);
  8. Code:
  9. 0: bipush 10
  10. 2: istore_1
  11. 3: bipush 20
  12. 5: istore_2
  13. 6: iload_1
  14. 7: iload_2
  15. 8: iadd
  16. 9: istore_3
  17. 10: return
  18. }

变量的作用域


  1. 数据类型及其范围

    【1-1】数据类型 - 图1
基本数据类型 字节数 表示范围 注意点
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

浮点类型

浮点类型常量

  1. 十进制表示形式: 180.5
  2. 科学计数法: 314e-2

    浮点类型变量

    float f = 8.5f;

    1. 8.5对应的二进制为 1000.1(8 4 2 1 2^-1)
    2. 计算符号位:因为是正数所以符号位为0
    3. 计算指数位:规范化表示小数点左侧只能由一位并且为1,所以上述1000.1应表示为1.0001*2^3,规定指数位的底为2且幂数要加127(这样便可以使用0~255表示-127~128的有符号值,具体参考这篇博客),因此指数位的值为130,转换为二进制为1000 0010
    4. 计算尾数位:规定尾数为要去掉规范化后的小数点前面的1,只保留小数部分,因此1.0001*2^3尾数位为0001
    5. 最终得到完整的浮点数为 0 1000 0010 0001 0000 0000 0000 0000 000

数据类型转换

常见类型转换会发生什么?

int->double

  1. double a = 6;//6.0

double->int

  1. int i = 6.5;//精度损失,报错
  2. int j = (int)6.5;//6,不存在四舍五入,直接舍弃小数点后的内容

多种数据类型参与运算

多种数据类型参数运算时,整数类型、浮点类型、字符类型都可以参与运算,唯独布尔类型不可以参与运算

类型级别

byte\short\char ——> int ——> long ——> float ——> double
当一个表达式中有多种数据类型参与运算时,要找出当前表达式中级别最高的类型,然后其余的类型都转换为当前表达式中级别最高的类型进行计算。

特殊

  1. 对于byte、short、char类型来说,只要在他们的表述范围内,赋值的时候就不需要进行强制类型转换,直接赋值即可

    1. byte b = 12;//没有强转

    三目运算符

    《The JavaLanguage Specification》中有介绍:

  2. 三目运算中当第二位和第三位操作符类型相同时,则萨努运算符表达式结果与这两位操作数的类型相同

  3. 当第二三操作数为别为基本类型和包装类型时,那么该表达式的结果的类型要求是基本类型。(为了让程序员减少感知,会进行包装类自动拆箱。因为包装类可以为null,因此拆箱后null可能会被赋值给基本数据类型,导致空指针异常)