二、变量与运算符

发布时间 2023-12-24 00:33:05作者: termsw

1.关键字(keyword)

定义:被Java语言赋予了特殊含义,用做专门用途的字符串(或单词),这些字符串(或单词)已经被Java定义好了。

特点:全部关键字都是小写字母。

关键字查阅的官方地址: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html

2.标识符(identifier)

Java中类名、变量名、方法名、数组名、文件名等要素命名时使用的字符序列,称为标识符。凡是自己可以起名字的地方都叫标识符。

标识符的命名规则(必须遵守的硬性规定):

  • 由英文字母大小写,数字,_或 $ 组成
  • 不能使用数字开头
  • 不能使用关键字和保留字,但能包含关键字和保留字
  • Java中严格区分大小写,长度无限制
  • 标识符不能包含空格

标识符的命名规范:

  • 包名:多单词组成时所有字母都小写:xxxyyyzzz
  • 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz(大驼峰)
  • 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz(小驼峰)
  • 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ

注意(重要):在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。更多细节详见《代码整洁之道_关于标识符.txt》《阿里巴巴Java开发手册-1.7.1-黄山版》

3.变量

3.1 什么是变量

在程序运行过程中,空间内的值是变化的,这个内存空间就称为变量。变量是程序中不可或缺的组成单位,最基本的存储单元

变量的使用是程序设计中一个十分重要的环节。声明变量就是要告诉编译器这个变量的数据类型,这样编译器才知道需要配置多少空间给它,以及它能存放什么样的数据。

3.2 变量的概念

  • 内存中的一个存储区域,该区域的数据可以在同一类型范围内不断变化

  • 变量的构成包含三个要素:数据类型、变量名、存储的值

  • java语言中声明变量:数据类型 变量名 = 变量值

  • 变量的作用:用于在内存中保存数据

  • 使用变量应该注意的事项:

    • 声明变量时必须注意标识符的命名规则和规范,使用小驼峰定义变量名;

    • java中每个变量必须先声明,后使用;

    • 变量的作用域:变量都有其作用域,变量只在这个作用域是有效的,出了这个作用域就失效了,其定义所在的一对{ }内就是该变量的作用域;

    • 变量在赋值时,必须满足声明变量时定义的数据类型并且不能超出该数据类型的表数范围。例如:

      class test {
          public static void main(String[] args) {
              //下面声明两个变量并赋值来验证变量赋值时的注意事项
              byte a = 128;
              int b = 'helloworld';
              System.out.println("a");
              System.out.println("b");
          }
      }
      
    • 同一个作用域内,不能定义重名的变量

3.3 变量的使用

3.3.1 声明变量

声明变量的格式:数据类型 变量名;

/* 下面是声明变量的举例*/
class Test {
    public static void main(String[] args){
        
        int age; //声明一个存储int型数据的年龄变量
        double weight; //声明一个存储double型数据的体重变量
        char gender; //声明一个存储int型数据的年龄变量
        boolean marry; //声明一个存储boolean型数据的婚姻状态变量   
        String name; //声明一个存储String型数据的姓名变量
        int a,b,c; //声明多个同类型的变量
        int d = 1; //声明一个存储int型的变量并给它赋值1
    }
}

3.3.2 变量赋值

变量赋值的格式:变量名 = 值;

...
    age = 18; //给3.3.1中声明的变量age赋值18
	gender = '女'; //给3.3.1中声明的变量gender赋值女

4.数据类型

image-20231220193503308

4.1 基本数据类型

4.1.1 整数类型:byte、short、int、long

  • 整数类型简称整型,用来存储整数数值,既没有小数部分的数值。可以是正数,也可以是负数。整型数据根据它所占内存大小的不同分为byte、short、int、long。
  • 注意:声明long类型时,需要提供后缀,'l'或'L'。例如:long x = 123123123123l;

image-20231220225704110

4.1.2 浮点类型:float、double

  • 浮点类型称为浮点型,用来存储含有小数部分的数值。Java中浮点类型分为单精度浮点类型(float)和双精度浮点类型(double),它们具有不同的取值范围。
  • 定义float类型变量,赋值时需要以"f"或“F”作为后缀。Java中默认情况下小数都被看作double型。
  • 注意:浮点值属于近似值,在计算机系统中运算后的结果可能与实际有偏差。并不是所有小数都能精确的用二进制浮点数表示,浮点型的数据不适合运用在不容许舍入误差的金融计算领域等高精度需求的领域。

image-20231220230539943

4.1.3 字符类型:char

  • 字符类型用于存储单个字符,占用16位(两个字节)的内存空间;

  • Java中的所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符;

  • Java语言也可以把字符作为整数对待。由于Unicode编码采用无符号编码,可以存储65536个字符(0x00000xffff),所以Java中的字符几乎可以处理所有国家的语言文字。若想得到一个065536的数所代表的Unicode表中相应位置上的字符,也必须使用char型显示转换。

  • 在定义字符类型时,使用一对单引号表示,内部只能有一个字符

  • 字符变量的几种表现形式:

    • 形式1:使用单引号(' ')括起来的单个字符

      //使用char关键字可定义字符变量,其语法如下:
      char x = 'a';
      //由于字符a在Unicode表中的排序位置是97,因此上面的语句也可以写成:
      char x = 97; //这行也可理解为想要得到Unicode表中第97个字符,使用char型显示转换
      
    • 形式2:直接使用 Unicode值来表示字符型常量:‘\uXXXX’。其中,XXXX代表一个十六进制整数

    • 形式3:Java中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量

  • 转义字符:

    ​ 转义字符是一种特殊的字符变量,它以反斜杠“\”开头,后跟一个或对公字符。转义字符具有特定含义,不同于字符原有的意义,故称为转义字符。

转义字符 说明 Unicode表示方式
\n 换行符 \u000a
\t 制表符 \u0009
\" 双引号 \u0022
\' 单引号 \u0027
\\ 反斜线 \u005c
\b 退格符 \u0008
\r 回车符 \u000d
\f 换页符
...... ...... ......

4.1.4 布尔类型:boolean

  • 布尔类型又称为逻辑类型,通过关键字boolean来定义布尔类型变量;

  • 布尔类型只有turefalse两个取值,分别代表布尔逻辑中的”真“和“假”;

  • 布尔类型通常用在流程控制语句中,作为判断条件;

  • 例子说明:

    boolean b; //定义布尔类型变量
    boolean b1,b2; //定义多个布尔类型变量
    b1 = ture; //给boolean类型变量赋值ture
    b2 = false; //给boolean类型变量赋值false
    

4.2 基本数据类型变量间运算规则

在Java程序中,不同的基本数据类型(只有7种,不包含boolean类型)变量的值经常需要进行相互转换。

转换的方式有两种:自动类型提升强制类型转换

4.2.1 自动类型提升

  • 规则:当数据类型表数范围小的变量与数据类型表数范围大的变量做运算时,结果自动转换为表数范围大的数据类型变量值:

  • byte、short、char -->> int -->> long -->> float -->> double

  • 特殊情况:

​ byte、short、char类型的变量之间做运算,结果为int类型。

/*
* 基本数据类型变量间的自动类型提升测试
* byte、short、char --> int --> long --> float --> double
* 下面是进行自动类型提升中的特殊情况测试验证学习
* */
public class VariableTest {

    public static void main(String[] args) {
        //声明变量
        byte b1,b2;
        short s1,s2;
        char c1,c2;
        //变量赋值
        b1 = b2 = 1;
        s1 = s2 = 3;
        c1 = c2 = 'a';
        //System.out.println(((Object)(x)).getClass().getSimpleName())是打印出x的值的数据类型
        System.out.println(((Object)(b1+b2)).getClass().getSimpleName()); // byte + byte
        System.out.println(((Object)(s1+s2)).getClass().getSimpleName()); // short + short
        System.out.println(((Object)(c1+c2)).getClass().getSimpleName()); // char + char
        System.out.println(((Object)(b1+s1)).getClass().getSimpleName()); // byte + short
        System.out.println(((Object)(b1+c1)).getClass().getSimpleName()); // byte + char
        System.out.println(((Object)(s1+c1)).getClass().getSimpleName()); // short + char
    }
}

image-20231223143922228

4.2.2 强制类型转换

  • 当需要将变量转换为比当前表数范围小的数据类型,就需要使用强制类型转换

  • 转换格式:

//(要转换的数据类型)被强制转数据类型的变量名;
int i1 = 1;
    
System.out.println(((Object)(short)i1).getClass().getSimpleName());
System.out.println(((Object)(byte)i1).getClass().getSimpleName());

image-20231223151135174

  • 强制类型转换会出现精度损失和精度溢出

4.3 基本数据类型与String的运算

4.3.1 字符串类型:String

  • String是一个类,属于引用数据类型不属于基本数据类型
  • 使用一对""来表示一个字符串,内部可以包含0个、1个或多个字符。
  • 字符串变量的声明和赋值:
//String 变量名 = "字符串";
String str = "Hello World!!!!!";

4.3.2 运算规则

  • 任意八种基本数据类型中的一种与String类型只能进行连接“+”运算,且结果一定也是String类型;
  • String类型不能强制类型转换;
//String类型变量“+”运算,例子
int i = 10;
boolean b = true;
float f = 10.0f;
String str2 = "hello";

System.out.println(i + str2);
System.out.println(b + str2);
System.out.println(f + str2);

5.运算符

  • 运算符是一些特殊符号,主要用于数学函数、一些类型的赋值语句和逻辑比较方面;
  • Java中提供了丰富的运算符

image-20231223211725083

  • 运算符按操作数个数可划分为:一元运算符(单目运算符)、二元运算符(双目运算符)、三元运算符 (三目运算符)
分类 运算符
一元运算符(单目运算符) 正号(+)、负号(-)、++、--、!、~
二元运算符(双目运算符) 除了一元和三元运算符剩下的都是二元运算符
三元运算符 (三目运算符) (条件表达式)?结果1:结果2

5.1 算术运算符

Java中的算术运算符主要有+(加)、-(减)、*(乘)、/(除)、%(取余)、++(自增)、--(自减)

操作符 描述 例子(a = 1, b= 2)
+ 加法 - 相加运算符两侧的值 a + b 等于3
- 减法 - 左操作数减去右操作数 a - b 等于-1
* 乘法 - 相乘操作符两侧的值 a * b 等于2
/ 除法 - 左操作数除以右操作数 b / a 等于2
% 取余 - 左操作数除以右操作数的余数 b % a 等于 0
++ 自增: 操作数的值增加1
-- 自减: 操作数的值减少1

注意:自增、自减运算符是单目运算符,可以放在操作元之前,也可以放在操作元之后。操作元必须是一个整型或浮点型变量。

++a(--a)		//表示在使用变量a之前,先使a的值加1(或减1)
a++(a--)		//表示在使用变量a之后,使a的值加1(或减1)

例如:

int a = 1;
int b,c;
b = ++a;	//先将a的值加1,然后再赋值给b,此时b为2。
c = a++;	//先将a的值赋值给c,然后a再+1,此时c为1。

5.2 关系(比较)运算符

Java中比较运算符属于二元运算符,用于程序中变量之间、变量和自变量之间以及其他类型的信息之间比较。

操作符 描述
== 用于判断两个对象是否相等
!= 用于判断两个对象是否不相等
> 用于比较两个对象的大小
< 用于比较两个对象的大小
>= 用于判断一个对象是否大于或等于另一个对象
<= 用于判断一个对象是否小于或等于另一个对象
  • 比较运算符的运算结果只为boolean,要么是true,要么是false
  • >、<、>=、<= :只适用于基本数据类型(除boolean类型之外)
  • ==、!= :适用于基本数据类型和引用数据类型

5.3 逻辑运算符

运算符 含义 用法
&&、& 逻辑与 op1 && op2
|| 逻辑或 op1 || op2
! 逻辑非 !op
^ 异或 op1^op2
  • 逻辑运算符,操作的都是boolean类型的变量,运算结果也是boolean类型的值
  • 运算符说明:
    • & 和 &&:表示"且"关系,当符号左右两边布尔值都是true时,结果才能为true。否则,为false;
    • || :表示"或"关系,当符号两边布尔值有一边为true时,结果为true。当两边都为false时,结果为false;
    • ! :表示"非"关系,当变量布尔值为true时,结果为false。当变量布尔值为false时,结果为true。
    • ^:当符号左右两边布尔值不同时,结果为true。当两边布尔值相同时,结果为false。

5.4 位运算符

位运算符除“按位与”和“按位或”运算符外,其他只能用于处理整数的操作数,包括byte、short、char、int和long等数据类型。位运算符是完全针对位方面的操作。

image-20231223225113105

image-20231223225156969

  • 位运算符的运算过程都是基于二进制的补码运算

(1)左移:<<

运算规则:在一定范围内,数据每向左移动一位,相当于原数据*2。(正数、负数都适用)

【注意】当左移的位数n超过该数据类型的总位数时,相当于左移(n-总位数)位

3<<4  类似于  3*2的4次幂 => 3*16 => 48

image-20231223231142216

-3<<4  类似于  -3*2的4次幂 => -3*16 => -48

image-20231223231235451

(2)右移:>>

运算规则:在一定范围内,数据每向右移动一位,相当于原数据/2。(正数、负数都适用)

【注意】如果不能整除,向下取整

69>>4  类似于  69/2的4次 = 69/16 =4

image-20231223231337252

-69>>4  类似于  -69/2的4次 = -69/16 = -5

image-20231223231445914

(3)无符号右移:>>>

运算规则:往右移动后,左边空出来的位直接补0。(正数、负数都适用)

69>>>4  类似于  69/2的4次 = 69/16 =4

image-20231223231542402

-69>>>4   结果:268435451

image-20231223231613554

(4)按位与:&

运算规则:对应位都是1才为1,否则为0。

  • 1 & 1 结果为1

  • 1 & 0 结果为0

  • 0 & 1 结果为0

  • 0 & 0 结果为0

9 & 7 = 1

image-20231223231643136

-9 & 7 = 7

image-20231223231724246

(5)按位或:|

运算规则:对应位只要有1即为1,否则为0。

  • 1 | 1 结果为1

  • 1 | 0 结果为1

  • 0 | 1 结果为1

  • 0 & 0 结果为0

9 | 7  //结果: 15

image-20231223231805332

-9 | 7 //结果: -9

image-20231223231852136

(6)按位异或:^

运算规则:对应位一个为1一个为0,才为1,否则为0。

  • 1 ^ 1 结果为0

  • 1 ^ 0 结果为1

  • 0 ^ 1 结果为1

  • 0 ^ 0 结果为0

9 ^ 7  //结果为14

image-20231223232027683

-9 ^ 7 //结果为-16

image-20231223232054199

(7)按位取反:~

运算规则:对应位为1,则结果为0;对应位为0,则结果为1。

  • ~0就是1

  • ~1就是0

~9  //结果:-10

image-20231223232135664

~-9  //结果:8

image-20231223232158113

5.5 赋值运算符

运算符 符号解释
+= 将符号左边的值右边的值进行相加操作,最后将结果赋值给左边的变量
-= 将符号左边的值右边的值进行相减操作,最后将结果赋值给左边的变量
*= 将符号左边的值右边的值进行相乘操作,最后将结果赋值给左边的变量
/= 将符号左边的值右边的值进行相除操作,最后将结果赋值给左边的变量
%= 将符号左边的值右边的值进行取余操作,最后将结果赋值给左边的变量

5.6 条件(三元)运算符

  • 三元运算符的使用格式:
(条件表达式)? 值1 : 值2
  • 说明:条件表达式是boolean类型的结果,根据boolean的值选择值1或值2。如果条件表达式为true运算结果是值1,反之为值2。

  • 如果运算后的结果赋给新的变量,要求值1和值2为同种或兼容的数据类型

  • 举例说明:

String str1 = (1 > 2)? "true" : "false";
String str2 = (1 < 2)? "true" : "false";
boolean b1 = (1 > 2)? true : false;
boolean b2 = (1 < 2)? true : false;
System.out.println(str1);
System.out.println(str2);
System.out.println(b1);
System.out.println(b2);

image-20231223234407193

6.运算符优先级

运算符有不同的优先级,所谓优先级就是在表达式运算中的运算符顺序。

优先级 运算符说明 Java运算符
1 括号 ()[]{}
2 正负号 +-
3 单元运算符 ++--~
4 乘法、除法、求余 */%
5 加法、减法 +-
6 移位运算符 <<>>>>>
7 关系运算符 <<=>=>instanceof
8 等价运算符 ==!=
9 按位与 &
10 按位异或 ^
11 按位或 `
12 条件与 &&
13 条件或 `
14 三元运算符 ? :
15 赋值运算符 =+=-=*=/=%=
16 位赋值运算符 &=、`