Java 语法基础
Java语言的语法简洁明了,容易掌握,而且还是纯面向对象的编程思想,简单性主要体现在以下几个方面:
1. 语法规则和C++相似,但从某种意义上讲,它是由C和C++演变而来,所以C程序设计人员能很容易的掌握java语言的语法。
2. 对C++来说进行了简化和一定的提高,如:使用接口代替了复杂的多重继承以及取消了指针,还通过实现垃圾自动回收机制,大大简化了程序员的资源释放管理工作。
3. 提供了丰富的类库和API文档,以及第三方开发包工具包,还有大量的基于java的开源项目,帮助程序设计人员参考学习,JDK(java开发工具包)就是开放的源代码之一,读者可以通过分析项目的源代码,来提高自己的编程水平。
1. Java关键字
在Java中,有一些特殊的单词被称为关键字(Keyword)。这些关键字是Java语言保留的,用于执行特定的功能,例如定义类、方法和变量等。
48个关键字:abstract、assert、boolean、break、byte、case、catch、char、class、continue、default、do、double、else、enum、extends、final、finally、float、for、if、implements、import、int、interface、instanceof、long、native、new、package、private、protected、public、return、short、static、strictfp、super、switch、synchronized、this、throw、throws、transient、try、void、volatile、while。
2个保留字:goto const
3个特殊直接量:true、false、null
关键字含义:
| 关键字 | 所属含义 |
|---|---|
| abstract | 表明类或者成员方法具有抽象属性 |
| assert | 断言,用来进行程序调试 |
| boolean | 基本数据类型之一,声明布尔类型的关键字 |
| break | 提前跳出一个块 |
| byte | 基本数据类型之一,字节类型 |
| case | 用在 switch 语句之中,表示其中的一个分支 |
| catch | 用在异常处理中,用来捕捉异常 |
| char | 基本数据类型之一,字符类型 |
| class | 声明一个类 |
| const | 保留关键字,没有具体含义 |
| continue | 回到一个块的开始处 |
| default | 默认,例如,用在 switch 语句中,表明一个默认的分支 |
| do | 用在 do-while 循环结构中 |
| double | 基本数据类型之一,双精度浮点数类型 |
| else | 用在条件语句中,表明当条件不成立时的分支 |
| enum | 枚举 |
| extends | 表明一个类型是另一个类型的子类型,表示继承关系,这里常见的类型有类和接口 |
| final | 表示不可变,最终的,在Java中表示常量 |
| finally | 用于处理异常情况,用来声明一个基本肯定会被执行到的语句块 |
| float | 基本数据类型之一,单精度浮点数类型 |
| for | 一种循环结构的引导词 |
| goto | 保留关键字,没有具体含义 |
| if | 条件语句的引导词 |
| implements | 表明一个类实现了给定的接口 |
| import | 表明要访问指定的类或包 |
| instanceof | 用来测试一个对象是否是指定类型的实例对象 |
| int | 基本数据类型之一,整数类型 |
| interface | 接口 |
| long | 基本数据类型之一,长整数类型 |
| native | 用来声明一个方法是由与计算机相关的语言(如 C/C++语言)实现的 |
| new | 用来创建新实例对象 |
| package | 包 |
| private | 一种访问控制方式:私用模式 |
| protected | 一种访问控制方式:保护模式 |
| public | 一种访问控制方式:共用模式 |
| return | 从成员方法中返回数据 |
| short | 基本数据类型之一,短整数类型 |
| static | 表明具有静态属性 |
| strictfp | 用来声明 FP_strict(单精度或双精度浮点数)表达式遵循IEEE 754 算术规范 |
| super | 表明当前对象的父类型的引用或者父类型的构造方法 |
| switch | 分支语句结构的引导词 |
| synchronized | 表明一段代码需要同步执行 |
| this | 指向当前实例对象的引用 |
| throw | 抛出一个异常 |
| throws | 声明在当前定义的成员方法中所有需要抛出的异常 |
| transient | 声明不用序列化的成员域 |
| try | 尝试一个可能抛出异常的程序块 |
| void | 声明当前成员方法没有返回值 |
| volatile | 表明两个或者多个变量必须同步地发生变化 |
| while | 用在循环结构中 |
| null | 引用数据类型默认初始值 |
2.Java数据类型
Java的数据类型只有两大类:8大基本数据类型与引用数据类型,其中基本数据类型又被称为值类型。
2.1. 基本数据类型
6种数字类型(byte/short/int/long/float/double)、1种字符型(char)、1种布尔型(boolean)
| 基本类型 | 存储大小 | 初始化默认值 | 取值范围 | 包装类型 |
|---|---|---|---|---|
| byte | 1字节(8位) | 0 | -128~127 | Byte |
| short | 2字节(16位) | 0 | -32768~32767 | Short |
| int | 4字节(32位) | 0 | -2^31 ~ 2^31 - 1 | Integer |
| long | 8字节(64位) | 0L。"L"理论上不分大小写,但若写成"l"容易与数字"1"混淆,不容易分辨,所以最好大写。 | -2^63 ~ 2^63 - 1 | Long |
| float | 4字节(32位) | 0.0f | 符合IEEE754标准的浮点数,1.4E-45 ~ 3.4028235E38 | Float |
| double | 8字节(64位) | 0.0d | 符合IEEE754标准的浮点数,4.9E-324 ~ 1.7976931348623157E308 | Double |
| char | 2字节(16位) | ‘\u0000’ | \u0000 ~ \uffff(十进制等效值为 0~65535,本质也是数值) | Character |
| boolean | 1字节(8位)/4字节(32位) | false | true/false | Boolean |
2.2. 引用数据类型
类(Class)、接口(Interface)、数组(Array),引用类型参数传递时,以拷贝引用地址的方式传递给接收变量,而非复制整个数据本体。除八大基本数据类型之外的所有数据类型,都为引用数据类型。所有引用数据类型的默认值都为null。
2.3. 包装类
Java代码的基本格式除了以上的基本数据类型和引用数据类型,还有一些其他相关的数据类型,例如字符串类型String、枚举类型Enum,它们都是基于引用数据类型来实现的。包装类为基本数据类型与引用数据类型互相转换、以利用彼此的特性,java为每一种基本数据类型提供了相应的包装类。包装类对基本数据类型进行了封装,提供了丰富的功能,包装类是基本类型的拓展。包装类是引用类型的一种,包装类与基本数据类型一一对应,也有8种,分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean
2.4. 基本数据类型与引用数据类型区别
- 存储方式:基本数据类型直接存储值,而引用数据类型存储的是对象的引用(内存地址)
- 内存分配:基本数据类型在栈上分配内存,引用数据类型在堆上分配内存(具体内容存放在堆中,栈中存放的是其具体内容所在内存的地址)。栈上的分配速度较快,但是内存空间较小,而堆上的分配速度较慢,但可以分配更大的内存空间
- 默认值:基本数据类型会有默认值,例如int类型的默认值是0,boolean类型的默认值是false。而引用数据类型的默认值是null,表示没有引用指向任何对象
- 复制操作:基本数据类型进行复制时,会复制该变量的值。而引用数据类型进行复制时,只会复制对象的引用,两个变量指向同一个对象
- 参数传递:基本数据类型作为方法的参数传递时,传递的是值的副本,不会修改原始值。而引用数据类型作为方法的参数传递时,传递的是对象的引用,可以修改对象的属性或状态
- 比较操作:基本数据类型使用==进行比较时,比较的是值是否相等。而引用数据类型使用==进行比较时,比较的是引用是否指向同一个对象,如果要比较对象的内容是否相同,需要使用equals()方法
3. Java代码的基本格式
Java代码的基本格式如下:
package 包名;
import package1.[.package2…].类名;
修饰符 class 类名{
类体;
}3.1. 类
Java是面向对象的程序设计语言,Java程序由类(class)组成,而类是Java程序的基本单元。声明一个类的一般形式如下:
标识符修饰符 class 类名{
类体;
}
1.4 main()方法3.2. main()方法
main()方法是Java程序执行的入口,其语法格式如下:
public static void main (String[] args) {
方法体;
}
3.3. 方法
方法用于改变对象的属性,或者用于接收来自其他对象的信息以及向其他对象发送消息。它在类中用来描述类的行为,其定义格式如下:
修饰符 返回类型 方法名 (参数类型1 参数名1, …, 参数类型n 参数名n) {
//方法体;
return 返回值;
}3.4. 标识符
标识符是用来表示Java中的包、类、方法、变量、常量等的名称。命名规则如下:
- 标识符由字母、数字、下划线及美元符号($)组成
- 标识符首字母不能使用数字
- 标识符不能是关键字,如class
- 标识符区分大小写
3.5. 修饰符
修饰符指定数据、方法及类的属性的可见度,如public、protected、private等。被它们修饰的数据、方法或类的可见度是不同的
| 限定词 | 同一类中 | 同一个包中 | 不同包中的子类 | 不同包中的非子类 |
|---|---|---|---|---|
| private | √ | |||
| 无限定词 | √ | √ | ||
| protected | √ | √ | √ | |
| public | √ | √ | √ | √ |
3.6. 程序块
程序块是指一对大括号({})之间的内容,且程序中的大括号必须是成对出现的
3.7. 语句
Java程序中语句使用“;”作为语句结尾,而“;”也标志着一个语句的结束
3.8. Java代码的注释
单行注释
//注释内容多行注释
/*
注释内容
*/文档注释
/**
注释内容
*/4. 常量
常量就是在程序中固定不变的量,一旦被定义,它的值就不能再被改变,在定义常量时需要对常量进行初始化,初始化后,不允许对常量的值进行更改。在Java中,常量名通常使用大写字母,如PI、AGE等。常量声明语法如下:
final 数据类型 常量名称 [= 值]; //[]中的内容为可选5. 变量
一些在程序运行过程中数据值会发生改变的数据被称为变量,在Java中,所有的变量在使用前必须先声明,声明多个变量时必须使用逗号分隔开,声明变量的基本格式如下:
类型 变量名 [ = value][, 变量名 [= value] …];5.1. 变量的分类
5.1.1. 成员变量
成员变量声明在一个类中,在方法、构造方法及语句块之外,其作用范围为整个类,在这个类中都可以访问到该成员变量。当一个对象被实例化之后,每个成员变量的值也就跟着确定,成员变量在对象创建的时候创建,在对象被销毁的时候销毁,成员变量可以直接通过变量名访问,但在静态方法及其他类中,就要通过类的引用访问。
成员变量的值应该至少被一个方法、构造方法或语句块引用,使得外部能够通过这些方式获取成员变量的信息。
访问修饰符可以修饰成员变量,成员变量对于类中的方法、构造方法或语句块是可见的。一般情况下,应该把成员变量设为私有(private)。通过使用访问修饰符可以使成员变量对子类可见。
5.1.2. 局部变量
局部变量在方法、构造方法或语句块中声明,它在方法、构造方法或语句块被执行的时候创建,当它们执行完成后,变量将会被销毁。访问修饰符不能用于局部变量,局部变量只在声明它的方法、构造方法或语句块中可见。局部变量没有默认值,所以局部变量被声明后,必须经过初始化才可以使用。
5.1.3. 静态变量
静态变量在类中以static关键字声明,必须在方法、构造方法和语句块外。无论一个类创建多少个对象,类只拥有静态变量的一份拷贝,静态变量的访问格式一般为:
类名.变量名静态成员变量的默认值和成员变量一样,变量的值可以在声明时指定,也可以在构造方法中指定,除此之外,静态变量还可以在静态语句块中初始化。
5.2. Java中静态变量和成员变量的区别
类的成员变量按照是否被static修饰可分为两种:一种是被static修饰的变量,叫静态变量,而另一种是没有被static修饰的变量,叫成员变量。
静态变量和成员变量的区别如下:
(1) 静态变量在内存中只有一份拷贝(节省内存),JVM只为静态变量分配一次内存,在加载类的过程中完成静态变量的内存分配,可以用类名直接访问;
(2) 成员变量是每创建一个对象,就会为成员变量分配一次内存,成员变量可以在内存中有多个拷贝,互不影响(灵活)。
6. 运算符
运算符是在用变量或常量进行运算时经常使用的符号。根据操作数的数目来分,运算符分为一元运算符、二元运算符和三元运算符。根据功能来分,运算符分为赋值运算符、算术运算符、比较运算符、条件运算符、逻辑运算符、位运算符及自增自减运算符。
6.1. 赋值运算符
赋值运算符就是用于完成赋值的运算符。最基本的算术运算符就只有一个,就是“=”,而在它的基础之上结合加、减、乘、除等,又形成了复合赋值运算符。
6.1.1. 基本赋值运算符
基本赋值运算符“=”是一个二目运算符,其功能是将右边的表达式或者任何数值赋给左边的变量。
6.1.2. 复合赋值运算符
在基本的赋值运算符基础上,可以结合算术运算符形成复合运算符,其具有特殊含义。常用的复合赋值运算符如下表所示:
| 赋值运算符 | 范例 | 含义 |
|---|---|---|
| += | a += b | a = a + b |
| -= | a -= b | a = a - b |
| *= | a *= b | a = a * b |
| /= | a /= b | a = a / b |
| %= | a %= b | a = a % b |
| &= | a &= b | a = a & b |
| |= | a |= b | a = a | b |
| ^= | a ^= b | a = a ^ b |
6.2. 算术运算符
算术运算符的功能是进行算术运算。算术运算符可以分为加(+)、减(-)、乘(*)、除(/)及取模这5种运算符,它们组成了程序中最常用的算术运算符。各种算术运算符的含义及其应用如下表所示:
| 运算符 | 含义 | 实例 | 结果 |
|---|---|---|---|
| + | 连接的两个变量或常量进行加法运算 | 5 + 6 | 11 |
| - | 连接的两个变量或常量进行减法运算 | 5月6日 | -1 |
| * | 连接的两个变量或常量进行乘法运算 | 5 * 6 | 30 |
| / | 连接的两个变量进行除法运算 | 5月6日 | 0 |
| % | 模运算,连接两个变量或常量进行除法运算的余数 | 5 % 6 | 5 |
6.3. 比较运算符
比较运算符是指对两个操作数进行关系运算的运算符,属于二元运算符。比较运算符也是Java程序中经常会用到的运算符,它的结果通常是布尔类型,可将它们的比较结果作为判断或循环的条件。常用的比较运算符的含义及应用如下表所示:
| 运算符 | 含义 | 实例 | 结果 |
|---|---|---|---|
| > | 大于运算符 | 6 > 8 | false |
| >= | 大于等于运算符 | 6 >= 8 | false |
| < | 小于运算符 | 6 < 8 | true |
| <= | 小于等于运算符 | 6 <= 8 | true |
| == | 等于运算符 | 6 == 8 | false |
| != | 不等运算符 | 6 != 8 | true |
6.4. 条件运算符
条件运算符的符号是“? : ”,条件运算符属于三目运算符,需要3个操作数,可将其理解为if…else语句的简化,一般语法结构如下:
Result = <expression> ? <statement1> : <statement2>6.5. 逻辑运算符
逻辑运算符用来把各个运算的变量(或常量)连接起来组成一个逻辑表达式,来判断编程中某个表达式是否成立,判断的结果是true或false。逻辑运算符的具体含义及应用如下表所示:
| 运算符 | 含义 | 实例 | 结果 |
|---|---|---|---|
| && | 逻辑与(AND) | false && true | false |
| || | 逻辑或(OR) | false || true | true |
| ! | 逻辑非(NOT) | !false | true |
逻辑与运算符表示它连接的两个条件同时成立时,整个逻辑与运算才成立;逻辑或运算符表示连接的两个条件其中有一个成立时,整个逻辑或运算就成立;而逻辑非运算符表示相反的运算,如果条件成立则使用逻辑非运算的逻辑表达式值为不成立,反之亦然。
6.6. 位运算符
位运算符主要用于对操作数为二进制的位进行运算。按位运算表示按每个二进制位来进行运算,其操作数的类型是整数类型以及字符类型,位运算符大致分为两大类,即按位运算符和移位运算符,各运算符的含义及功能如下表所示:
| 运算符 | 含义 | 实例 | 结果 | 运算分类 |
|---|---|---|---|---|
| & | 按位与 | 6 & 4 | 4 | 按位运算符 |
| | | 按位或 | 6 | 4 | 6 | |
| ^ | 按位异或 | 6 …… 4 | 2 | |
| ~ | 按位取反 | ~6 | -7 | |
| << | 左移 | 10<<1 | 20 | 移位运算符 |
| >> | 右移 | 10>>1 | 5 | |
| >>> | 无符号右移 |
6.6.1. 按位与运算
按位与运算的运算符为“&”,是双目运算符。其运算规则是:先将参与运算的数转换成二进制数,然后进行低位对齐,高位不足补零;如果对应的二进制位同时为1,则结果为1,否则为0。
2 & 3 = 22的二进制数为0010,3的二进制数为0011,按位与的结果是0010,换算成十进制即为2。
6.6.2. 按位或运算
按位或的运算符为“|”,是双目运算符,其运算规则也是需要先将参与运算的数转换成二进制,然后进行低位补齐,高位不足补零;如果对应的二进制位有一个为1,结果则为1,否则为0。
5 & 6 = 75转为二进制为0101,6的二进制为0110,按位或的结果是0111,换算成十进制即为7。
6.6.3. 按位异或运算
按位异或运算的运算符为“^”,是双目运算符,其运算规则是:先将参与运算的数转换成二进制,然后进行低位补齐,高位不足补零,如果对应的位同时为1(或同时为0),结果为0,否则结果为1。
7 ^ 8 = 157的二进制数为0111,8的二进制数为1000,按位异或的结果是1111,换算成十进制即为15。
6.6.4. 按位取反运算
按位取反运算的运算符为“~”,是单目运算符,其运算规则是:先将参与运算的数转换成二进制数,然后将各位数取反(1改为0,0改为1),二进制数在内存中是以补码形式存在的,最高位为符号位,正数的最高位为0,负数的最高位为1,若按位取反,还需结合最高位考虑
~9 = -10思路1:首先将9转换成二进制形式,即为0000 1001(这里用八位表示该原码),按位取反(包括符号位)得到1111 0110,除符号位,对其他位进行取反得到1000 1001,然后+1补码得到原码为1000 1010,最高位为1,所以是负数,而1010十进制为10,加上符号便为-10
思路2:将9装换成二进制形式,即为0000 1001, 按位取反得到1111 0110,减1补码得到1111 0101,除符号位取反,得原码1000 1010
思路3:最高位符号位变为1,低位1001加1即可
~-7 = 6思路1:首先将7转换成二进制形式,即为0000 0111,转化为负数,按位取反(包括符号位)得1111 1000,加1补码得1111 1001,按位取反(包括符号位)得0000 0110,即为6
思路2:首先将7转换成二进制形式,即为0000 0111,将0000 0111减1即为~-7的结果6
总结: 正数按位取反的话,将最高位改为1,低位+1即可;负数按位取反的话,取绝对值的二进制,低位减1即可。记住正+负-就行。
6.6.5. 左移位运算
左移位运算的运算符是“<<”,其运算规则是:按二进制形式把所有数字向左移动右边操作数指定的位数,高位数移出(舍弃),低位的空位补零。格式如下:
a << b该式子表示将a的二进制式的所有数字向左移动b位,相当于a * 2b,如3 << 2,就是将0000 0011向左移动2位,变为0000 1100,结果为3 * 22 = 12。
6.6.6. 右移位运算
右移位运算的运算符是“>>”,其运算规则是:按二进制形式把所有数字向右移动右边操作数指定的位数,低位移出(舍弃),高位补符号位(正数补0,负数补1)。格式如下:
c >> d该式子表示将c的二进制式的所有数字向右移动d位,相当于c / 2d如20 >> 2,就是将 0001 0100向右移动2位,变为0000 0101,结果为 20 / 22 = 5。
6.6.7. 无符号右移运算
无符号右移运算的运算符是“>>>”。其运算规则是:按二进制形式把所有数字向右移动右边操作数指定的位数,低位数移出(舍弃),高位补零。同右移位运算相似,只是无符号右移不需要高位补1。
6.7. 自增和自减运算符
自增(++)和自减(--)运算符是一种特殊的算术运算符,一般算术运算符需要两个操作数来进行运算,而自增和自减运算符只需要一个操作数。
“++”表示自增运算符,它表示对使用该运算符的变量进行加1的运算
“--”表示自减运算符,它表示对使用该运算符的变量进行减1的运算
当一个自增或自减运算符用在一个变量之前,则表示首先对该变量进行递增或递减运算,然后返回该变量的值。
6.8. 运算符优先级
| 优先级 | 运算符 |
|---|---|
| 1 | 括号,如()和[] |
| 2 | 一元运算符,如 -、++、-- 和 ! |
| 3 | 算术运算符,如 *、/、%、+ 和 - |
| 4 | 关系运算符,如 >、>=、<、<=、==和 != |
| 5 | 逻辑运算符,如 &、^、|、&&、|| |
| 6 | 条件运算符和赋值运算符,如 ? : 、=、*=、/=、+= 和 -= |
7. 流程控制
流程控制语句用于控制程序的流程,以实现程序的各种结构方式。所有应用程序开发环境都提供一个判定过程,称为控制流语句,即程序控制语句,它用于引导应用程序的执行。
程序控制语句分为3类:
分支语句:包括if语句和switch语句
循环语句:包括for循环语句、 while循环语句和do…while循环语句
跳转语句:包括break语句、 continue语句和return语句
7.1. 分支控制
顺序结构只能顺序执行,不能进行判断和选择,因此需要分支结构。分支结构是逻辑选择的核心,同时也是所有流程控制结构中最基础的控制语句。程序在执行过程中会根据条件来选择执行程序分支。分支语句包含两种重要的语句,使用它们可以实现程序流程的分支控制,这两种语句是 if 和 switch 语句。
7.1.1 if 语句
一个 if 语句包含一个布尔表达式和一条或多条语句。if 语句的一般语法结构如下:
if (布尔表达式)
{
//如果布尔表达式为true将执行的语句块
}如果布尔表达式的值为 true,则执行 if 语句中的代码块,否则执行 if 语句块后面的代码。
7.1.2 if…else 语句
if语句后面可以跟else语句,当if语句的布尔表达式值为false时,查else语句块会被执行。该语顺序结构只能顺序执行,不能进行判断和选择,因此需要分支结构。分支结构是逻辑选择的核心,同时也是所有流程控制结构中最基础的控制语句。程序在执行过程中会根据条件来选择执行程序分支。分支语句包含两种重要的语句,使用它们可以实现程序流程的分支控制,这两种语句是 if 和 switch 语句。句还可以嵌套使用,完成多路分支及更复杂的程序流程。使用它们的一般语法结构如下:
if (布尔表达式) {
//如果布尔表达式的值为true
} else {
//如果布尔表达式的值为false
}7.1.3 if…else if…else语句
if 语句后面还可以跟else if…else语句,这种语句可以检测到多种可能的情况,它的语法格式如下:
if (布尔表达式1) {
//如果布尔表达式1的值为true,执行该代码块
} else if (布尔表达式2) {
//如果布尔表达式2的值为true,执行该代码块
} else if (布尔表达式3) {
//如果布尔表达式3为true时,执行该代码块
} else {
//当以上布尔表达式的值都为false时,执行该代码块
}使用 if…else if…else 这个语句时,需要注意以下几点:
- if 语句最多只有一个else语句,且else语句要在所有的else…if 语句之后
- if 语句可以有若干个else if 语句,它们必须在else语句之前
- 一旦其中有一个else if 语句检测为true,其他的else if 及else语句都将跳过执行
7.1.4 嵌套使用 if…else语句
if…else 语句可以实现嵌套使用,不论是在 if 语句块还是在 else 语句块中,都可以再次嵌入 if…else 语句。嵌套使用 if…else 语句,可以实现控制程序的多个流程,实现多路分支,满足编程的需求。嵌套使用 if…else 的语法结构如下:
if (布尔表达式1) {
//如果布尔表达式1值为true,执行代码块
if (布尔表达式2) {
//如果布尔表达式2值为true,执行此代码块
} else {
//如果布尔表达式的值为false,执行此代码块
}
}7.1.5 switch语句
switch (判断的变量) {
case value1:
//执行语句1
break;
case value2:
//执行语句2
break;
…
case value n:
//执行语句n
break;
default: //可选
//执行语句
}switch语句有如下规则:
- switch语句有多个case语句,每个case后面跟一个比较比较的值和冒号。
- case语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
- 当变量的值与case语句的值相等时,那么执行这条case语句,直到break语句出现,跳出switch语句。
- 遇到break语句时,程序跳转到switch语句后面执行。如果没有break语句出现,成程序会继续执行下一条case语句,直到出现break语句。
- switch语句还可以包含一个default分支,该分支必须是switch语句的最后一个分支。 default语句在没有case语句的值和变量值相等的时候执行,default分支不需要break语句。
7.2 循环控制
顺序结构的程序语句只能被执行一次,如果想要同样的操作执行多次,就需要使用循环结构。
Java中三种主要的循环结构: while循环、 do while循环、 for 循环和增强型 for 循环。
7.2.1 for循环
for循环语句是技术型循环语句,提前指定循环的次数,适用于循环次数已知的情况。使用for循环时,一般遵循下面的语法结构:
for (初始化; 布尔表达式; 更新) {
循环体
}关于for循环有以下几点说明:
- 首先初始化变量。可以声明一种类型也可初始化一个或多个循环控制变量,还可以是空语句。
- 判断布尔表达式的值。如果为true,循环体被执行。如果为false,循环中止,开始执行循环体后面的语句。
- 执行一次循环后,更新循环控制变量。
- 再次判断布尔表达式,循环执行上面的过程。
7.2.2 while循环
while 循环是最基本的循环,它也可以控制一条或者多条语句的循环执行。和 for 循环语句相似,都需要一个判断条件,如果该条件为真则执行循环语句,否则跳出循环。而 for 循环语句与 while 循环语句不同的是 for 循环语句的循环次数确定,而 while 与循环语句的循环次数不确定。While循环的结构如下:
while (布尔表达式) {
//循环体
}7.2.3 do while循环
while循环有时称为“当型循环”,因为它在循环体执行前先进行条件判断,而do while循环称为“直到型循环”,它会先执行循环体,然后进行条件判断。使用do while循环的一般语法结构如下:
do {
//循环体
} while (布尔表达式);7.2.4 增强型for循环
增强型for循环的语法结构如下:
for (声明语句 : 表达式) {
//代码
}7.3 跳转语句
在使用循环语句时,只有循环条件表达式的值为假时才能结束循环。如果想提前中断循环,就需要在循环语句块中添加跳转语句。
跳转语句有break语句、continue语句和return语句。
- break语句跳出循环,执行循环后面的语句。
- continue语句是跳过本次循环,开始执行下一次循环。
- return语句是跳出方法,并为方法返回相应的值。
7.3.1 break语句
break主要用于在循环语句或者switch语句中,用来跳出整个语句块。break跳出最里层的循环,并且继续执行该循环下面的语句。 break的使用如前文switch。
7.3.2 continue语句
continue适用于任何循环控制结构中,作用是让程序立刻跳转到下一次循环的迭代。在for循环中, continue语句使程序立即跳转到更新语句。在while或do while循环中程序立即跳转到布尔表达式的判断语句。
7.3.3 return语句
return 语句经常使用在类的方法中,在类中使用 return 语句可以退出类的方法,把控制返回给该方法的调用者;如果方法有返回类型,则必须在方法中使用 return 语句返回一个该类型的值。使用return 语句的一般语法结构如下所示:
return 返回类型;