【Java笔记】03 变量

一、变量基本

  • 概念

变量是程序的基本组成单位,相当于内存中一个数据存储空间的表示,基本要素(类型、名称、值)

  • 步骤
  1. 声明变量 int a;
  2. 赋值 a=60;
  3. 使用 System.out.println(a);
  • 注意事项
    1.变量表示内存中的一个存储区域
    2.该区域有名称和内存
    3.先声明后使用
    4.该区域的数据在同一类型范围内变化
    5.变量在同一作用域不能重名

二、+的使用

1.左右都是数值型=>加法运算
2.左右两边有一方为字符串=>拼接运算

  1. System.out.println(100+98);//198
  2. System.out.println("100"+98);//10098
  3. System.out.println(100+3+"hello");//103hello
  4. System.out.println("hello"+100+3);//hello1003

三、数据类型

1.基本数据类型

  • 数值型
    整数类型,存放整数 byte(字节)[1],short[2],int[4],long[8]
    浮点类型 float[4],double[8]
  • 字符型
    存放单个字符 char[2]
  • 布尔型
    存放true,false boolean[1]
    2.引用数据类型
  • 接口
  • 数组

四、整数类型

类型 占用存储空间 范围
byte,字节 1字节 -128~127
short,短整型 2字节 -215 ~ 215-1,-32768~32767
int,整型 4字节 -231 ~ 231-1,-2147483648~2147483647
long,长整型 8字节 -263 ~ 263-1

1.Java各整数类型有固定的范围和字段长度,不受具体OS影响,保证可移植性
2.Java的整型常量默认为int,声明long需要后加’l’或’L’
3.Java程序中变量常声明为int型,除非不足以表示大数,才用long
4.bit:计算机中的最小存储单位
byte:计算机中基本存储单元,1 byte = 8 bit

五、浮点类型

类型 占用存储空间 范围
单精度float 4字节 -3.403E38~3.403E38
双精度double 8字节 -1.798E308~1.798E308

浮点数=符号位+指数位+尾数位
尾数部分可能丢失,造成精度损失
默认double,声明float型常量,后加f或F
0.12也可写成.12
通常使用double,精度更高

  1. double num1 = 2.7;
  2. double num2 = 8.1/3;
  3. System.out.println(num1); //2.7
  4. System.out.println(num2); //接近2.7的一个小数,而不是2.7

对运算结果是小数的进行相等判断时,Pay Attention!
正确写法:

  1. if(Math.abs(num1 - num2) < 0.000001) {
  2. //差值非常小,达到要求精度
  3. System.out.println("相等");
  4. }

但直接赋值时,两数可判断相等。

六、字符类型

字符类型可以直接存放一个数字
char c=97;
1.字符常量单引号
2.允许用转义字符 char c = ‘\t’;
3.Java中,char的本质是一个整数,在输出时,对应unicode码对应的字符
4.char类型是可以进行运算的,相当于一个整数

  1. System.out.println('a' + 10);//107
  2. char c5 = 'b' + 1;//98+1==> 99
  3. System.out.println((int)c5); //99
  4. System.out.println(c5); //99->ASCII码=>c
  • 字符类型本质
  • 字符存储到计算机中,将对应的码值找出来
    存储:’a’=>码值 97=>二进制 110 0001=>存储
    读取:二进制 110 0001=>97=>’a’=>显示
  • 编码表
  • ASCII 一个字节表示,128个字符。实际上一个字节可以表示256个字符,只用了128个
  • Unicode 固定大小的编码,使用两个字节来表示字符,字母和汉字都是占用两个字节,浪费空间
  • utf-8 大小可变的编码,字母使用1个字节,汉字使用3个字节
  • gbk 可表示汉字,范围更广泛,字母使用1个字节,汉字使用2个字节
  • gb2312 可以表示汉字,少用
  • big5 繁体汉字

七、布尔类型

占1个字节,适用于逻辑运算
只允许取值true和false
不能用0或非0代替false和true

八、数据类型转换

  • 自动类型转换
    1.精度小的类型自动转换为精度大的数据类型
    char -> int -> long -> float -> double
    byte -> short ->int -> long -> float ->double
    2.有多种类型的数据混合运算时,系统首先将所有数据转换成容量最大的那种数据类型,再进行计算
  1. public class Convert{
  2. public static void main (String[] args){
  3. int n1 = 10;
  4. //float d1 = n1 + 1.1;//错误 n1+1.1结果是double类型
  5. double d1 = n1 + 1.1;//✔
  6. float d = n1 + 1.1F;//✔
  7. }
  8. }

3.byte和short不能跟char进行自动类型转换
当把数赋给byte时,先判断该数是否在byte范围内

  1. byte b1 = 10;//✔ -128~127
  2. byte b = 1000;//✘ 超出范围
  3. int n2 = 1;
  4. byte b2 = n2;//✘ 变量赋值,会判断类型
  5. char c1 = b1;//✘

4.byte,short,char可以进行运算,都转成int

  1. byte b2 = 1;
  2. byte b3 = 2;
  3. short s1 = 1;
  4. short s2 = b2 + s1;//✘ byte和short运算时转成int,再赋值给小精度的short类型报错
  5. byte b4 = b2 + b3;//✘ byte和byte运算时转成int

5.boolean类型不参与自动类型转换

  • 强制类型转换
    自动类型转换的逆过程,容量大的数据类型转换为容量小的,可能造成精度降低或溢出
    e.g.:int i = (int)1.9;
    强转符号只对最近的操作数有效
  1. int x = (int)10*3.5+6*1.5;//编译错误:只强转了10,结果是double->int
  2. int y = (int)(10*3.5+6*1.5);//(int)44.0->44

char类型可以保存int的常量值,但不能保存int的变量值,需要强转

  1. char c1 = 100;//right
  2. int m = 100;
  3. char c2 = m;//错误
  4. char c3 = (char)m;//right 100对应的字符 d
  • 基本数据类型和String类型的转换
  1. 基本类型转String 加 “ “
  1. int n1 = 100;
  2. float f1 = 1.1F;
  3. double d1 = 4.5;
  4. boolean b1 = true;
  5. String s1 = n1 + "";
  6. String s2 = f1 + "";
  7. String s3 = d1 + "";
  8. String s4 = b1 + "";
  1. String类型转基本数据类型
    基本类型的包装类调用parseXX方法即可
  1. String s5 = "123";
  2. int num = Integer.parseInt(s5);
  3. double num1 = Double.parseDouble(s5);
  4. float num2 = Float.parseFloat(s5);
  5. long num3 = Long.parseLong(s5);
  6. byte num4 = Byte.parseByte(s5);
  7. boolean b = Boolean.parseBoolean("true");
  8. short num5 = Short.parseShort(s5);
  9. //字符串->字符,取字符串第一个字符
  10. System.out.println(s5.charAt(0));//1