<Java> 2_变量

本文最后更新于:2023年11月4日 凌晨

变量:变量是程序的基本组成单位

变量的三个基本要素:类型 + 名称 + 值

示例:int a = 1 类型 int 名称 a 值 1

变量相当于内存中的一个数据存储空间的表示

2.1 变量使用注意事项

  1. 变量表示内存中的一个存储区域。不同变量,不同类型,占用的空间大小不同。如 int 有 4 byte,而 double 有 8 byte。
  2. 该区域有自己的名称 变量名 和类型 数据类型
  3. 变量必须先声明,后使用。
  4. 变量在同一作用域内不能重名。
  5. 该区域的数据/值可以在同一类型范围内变化。
  6. 变量的三个基本要素: 变量名 + 值 + 数据类型

2.2 程序中 + 的使用

  1. 当左右两边都是数值型,做加法运算

  2. 当左右两边任意一方为字符串,做拼接运算

  3. 运算顺序是从左到右的

    1
    System.out.println(1 + 1 + "hello" + 8 + 9);		// 输出 2hello89

2.3 Java 数据类型

基本数据类型(记住!)

  • 数值型
    • 整数类型,存放整数:
      • byte:占用 1 字节
      • short:占用 2 字节
      • int:占用 4 字节
      • long:占用 8 字节
    • 浮点(小数)类型:
      • float:占用 4 字节
      • double:占用 8 字节
  • 字符型
    • char:存放单个字符,占用 2 字节
  • 布尔型
    • boolean:存放 true(真),false(假)。占用 1 字节

引用数据类型(复合数据类型)

  • :class

  • 接口:interface

  • 数组[]

字符串类型String实际上是一个”类“

2.4 整数类型

用于存放整数值

  • byte 占用 1 字节,范围 -128 ~ 127
  • short 占用 2 字节,范围 \(-2^{15} ~ 2^{15} - 1\)(-32768~32767)
  • int 占用 4 字节,范围 \(-2^{31} ~ 2^{31} - 1\)
  • long 占用 8 字节,范围 \(-2^{63} ~ 2^{63} - 1\)

使用细节:

  1. Java 各整数类型有固定的范围和字符长度,不受具体 OS(操作系统)影响,以保证 Java 程序的可移植性。
  2. Java 默认整型常量为 int ,要声明 long 型常量须后加‘l’‘L’
  3. java程序中变量常声明为int型,除非不足以表示大数,才用long

如果基本的整数、浮点类型不能满足范围、精度的需求,可以使用 “大数”(后面会讲)

2.5 浮点类型

可以表示一个小数

  • float 单精度(6 ~ 7 位有效数字),占用 4 字节,范围约 -3.403E38 ~ 3.403E38
  • double 双精度(15 位有效数字),占用 8 字节,范围约 -1.798E308 ~ 1.798E308

浮点数在机器中存放形式为:浮点数 = 符号位 + 指数位 + 尾数位

因此,尾数部分可能丢失,造成精度损失。所以,小数都是近似值

2.5.1 使用细节

  1. 与整数类型相似,Java浮点类型有固定的范围和字符长度,不受具体 OS(操作系统)影响。

  2. Java 默认浮点型常量为 double ,要声明 float 型常量必须后加 'f''F'

  3. 浮点型常量有两种表示形式

    • 十进制数形式:5.12315.4F.512
    • 科学计数法:5.12e2 即[5.12 × 10的二次方]、5.12E-2 即[5.12 / 10的二次方]
  4. 通常情况下,应该使用 double 类型,因为它比float型更为精确。

  5. 浮点数使用陷阱:当我们对运算结果是小数的进行相等判断时,要小心。(因为小数都是近似值

    正确方法是:以两个数差值的绝对值,在某个精度范围内判断

    1
    2
    3
    4
    5
    //num1 = 2.7
    //num2 = 8.1 / 3
    if (Math.abs(num1 - num2) < 0.000001) {
    System.out.println("差值非常小,到我的规定精度,认为相等");
    }

2.6 Java API文档

API(Application Programming Interface,应用程序编程接口)是 Java 提供的基本编程接口(java提供的类还有相关的方法)。中文在线文档https://www.matools.com/api/java8

2.7 字符类型

可以表示单个字符,字符类型是char,两个字节。

1
2
3
4
char c1 = 'a';
char c2 = '\t'; //输出一个制表位
char c3 = '字';
char c4 = 97; //输出一个a

2.7.1 使用细节

  1. 字符常量用单引号括起

  2. 字符允许使用转义符

  3. char 的本质是一个整数,默认输出时,输出的是 unicode 码对应的字符。

    要输出字符常量对应的整数,用 int

    1
    2
    char c1 = 'a';
    System.out.println((int)c1); //输出97
  4. char 是可以进行运算的,其相当于一个整数。

    1
    2
    3
    4
    5
    6
    // 注:(int)'a' = 97
    char c1 = 'a' + 1; // 相当于 char c1 = 'b'
    System.out.println('a' + 1); // 这个代码输出 98
    System.out.println(int(c1)); // 这个代码输出 98
    System.out.println(c1); // 这个代码输出 b
    System.out.println("a" + 1); // 这个代码输出 a1

2.7.2 字符本质与编码表

  1. 字符型 存储到 计算机中,需要将字符对应的码值(整数)找出来,比如’a’

    存储:’a’ ==> 码值 97 ==> 二进制(110 0001) ==> 存储

    读取:二进制(110 0001) ==> 97 ==> ’a’ ==> 显示

  2. 字符与码值的对应关系是字符编码表规定的。

    ASCII 编码表,占用 1 byte(字节),共有 128 个字符。缺点:不能表示所有的字符

    Unicode 编码表,占用 2 byte(2的16次方,最多65536个字符),字母汉字都占用 2 byte,将世界上所有的符号都纳入其中,这样可能浪费空间(字母多汉字少时)。0 - 127 的字符与 ASCII 相同,所以兼容 ASCII。

    UTF-8 编码表,根据不同符号大小可变(1 - 6 byte),字母占用 1 byte,汉字占用 3 byte。是 Unicode 的改进,是互联网上使用最广的 Unicode 实现方式。

    GBK 编码表,可以表示汉字,而且范围广,字母占用 1 byte,汉字占用 2 byte。

    GB2312 编码表,可以表示汉字,用的少(GB2312 < GBK)

    BIG5 编码表,可以存放繁体中文(香港,台湾)

2.8 布尔类型

boolean 只允许取值 turefalse ,没有 null。适用于逻辑运算,通常用于程序流程控制

使用细节:

  1. 不可以用 0 或 非0 的整数替代 falseture 。这点和 C语言 不同。

  2. 不能让布尔类型转换为其他类型。如需转换,请使用如下方法:

    1
    2
    boolean b = true;
    int n = b ? 0 : 1;

2.9 基本数据类型转换

2.9.1 自动类型转换

自动类型转换:Java 在进行赋值或运算时,精度(容量)小的类型自动转换为精度(容量)大的类型。

数据类型按精度(容量)大小排序为(背!

左边精度小,右边精度大

1
2
char -> int -> long -> float -> double
byte -> short -> int -> long -> float -> double

例子:int a = 'c' 或者 double b = 80

2.9.1.1 转换细节

  1. 有多种类型数据混合运算时,系统会将所有数据转换成容量最大的那种,再进行运算。

    1
    2
    3
    4
    int n1 = 10;
    float d1 = n1 +1.1; //错误
    double d1 = n1 +1.1; //正确
    float d1 = n1 +1.1F; //正确
  2. 如若把大精度(容量)数据赋值给小精度(容量)类型,就会报错(小数由于精度原因,大赋小会丢失精度,必不可用。但整数大赋小时:1.赋予具体数值时,判断范围。2.变量赋值时,判断类型。),反之进行自动类型转换。

  3. byteshortchar 三者不会相互自动转换,

    1
    2
    3
    4
    5
    6
    7
    byte b1 = 10;  //正确,当把具体数赋给 byte 时,先判断该数是否在byte范围内,如果是就可以。
    byte b3 = 10000; //错误

    int n2 = 1;
    byte b2 = n2; //错误,如果是变量赋值,判断类型

    char c1 = b1; //错误,不会自动转换
  4. byte short char 三者不会相互自动转换,但可以计算。计算时首先转化为 int

    1
    2
    3
    4
    5
    byte b2 = 1;
    byte b3 = 2;
    short s1 = 1;
    int s2 = b2 + s1; //正确
    byte b4 = b2 + b3; //错误
  5. boolean 类型不参与自动转换

    1
    2
    boolean pass = true;
    int num = pass; //错误
  6. 自动提升原则:表达式结果的类型自动提升为操作数中最大的类型。❤

2.9.2 强制类型转换

强制类型转换:自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时加上强制转换符 ( ) ,但可能造成精度降低或溢出,要格外注意。

2.9.2.1 使用细节

  1. 当进行数据从大到小转换时,就要用强制转换。

  2. 强制转换只能对最近的操作数有效,往往会使用 ( ) 提升优先级。

    1
    2
    int a = (int)10 * 3.5 + 6 * 1.5; //编译错误:double ->int
    int a = (int)(10 * 3.5 + 6 * 1.5);// 编译正确:(int)44.0 -> 44
  3. char 可以保留 int 的常量值,但不能保存其变量值。此时需要强制类型转换。

    1
    2
    3
    4
    int a = 10;
    char d = a; //错误
    char b = 100; //ok
    char c = (char)a ;//ok
  4. byte short char 在进行运算时,当作 int 处理。

2.9.2.2 练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
short s = 12; //ok,12在short的范围内
s = s - 9; //错误,int -> short

byte b = 10; //ok
b = b + 11; //错误,int -> byte
b = (byte)(b + 11); //ok

char c = 'a'; //ok
int i = 16; //ok
float d = .314F; //ok
double result = c + i + d; //ok,float -> double,自动转换

byte b = 16; //ok
short s = 14;//ok
short t = s + b; //错误,int -> short

2.9.3 基本数据类型和 String 的转换

  • 基本类型转 String:基本数据类型加上 " "即可。

    1
    2
    3
    4
    5
    6
    7
    int n1 = 100;
    float f1 = 1.1F;
    char c1 = '函';
    String s1 = n1 + "";
    String s2 = f1 + "";
    String str2 = c1 + ""; //char转String
    System.out.println(s1 + "" + s2 + "");
  • String 转基本数据类型:通过基本数据类型的包装类调用 parseXX 方法。

    1
    2
    3
    4
    String s = "123";
    int n1 = Integer.parseInt(s);
    double n2 = Double.parseDouble(s);
    float n2 = Float.parseFloat(s);

    特别的,把 String 转换为 char

    1
    char c = s.charAt(0);		// 得到 s 字符串中的第一个字符。

2.9.3.1 使用细节

  1. String 转成基本数据类型时,要保证其能转换为有效数据。比如:不能把 "Hello" 转换成 int
  2. 如果格式不正确,会抛出,程序会中止。(问题会在异常处理章节中处理)👓

<Java> 2_变量
http://viper2383.github.io/2023/11/01/Java 2 变量/
作者
w1per3
发布于
2023年11月1日
许可协议