My-Blog-Hexo/source/_posts/Java流程控制.md
2024-12-18 20:27:43 +08:00

284 lines
8.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Java流程控制
date: 2020-05-19 20:00:28
tags:
- Java
categories:
- Java基础
---
## 用户交互Scanner
java.util.Scanner是Java5的新特征我们可以通过Scanner 类来获取用户的输入。
<!--more-->
```java
Scanner s = new Scanner(System.in);
if (s.hasNext){
type name = s.next()
}
if (s.hasNextLine){
type name = s.nextLine()
}
s.close()
```
通过 Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用 hasNext()与hasNextLine()判断是否还有输入的数据。
> <span style="color:red">凡是属于IO流的类如果不关闭会一直占用资源要习惯用完就关掉.</span>
下面来看一下`next()`方法和`nextLine()`方法的区别
`next()`:
* 一定要读取到有效字符后才可以结束输入。
* 对输入有效字符之前遇到的空白next()方法会自动将其去掉。
* 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
* <span style="color:red">next()不能得到带有空格的字符串。</span>
`nextLine()`:
* 以Enter为结束符也就是说nextLine()方法返回的是输入回车之前的所有字符。
* 可以获得空白。
```java
import java.util.Scanner; //导入Scanner工具类
public class Test {
public static void main(String[] args) {
//创建扫描器Scanner对象用于接收键盘数据
Scanner in1 = new Scanner(System.in);
Scanner in2 = new Scanner(System.in);
//in1和in2都输入“hello world”
//判断用户有没有输入字符串
if(in1.hasNext()){
//使用next()方法接收
String str1 = in1.next();
System.out.println("用next()方法接收的输出:" + str1);
}
if(in2.hasNextLine()){
//使用nextLine()方法接收
String str2 = in2.nextLine();
System.out.println("用nextLine()方法接收的输出:" + str2);
}
//凡是属于IO流的类如果不关闭会一直占用资源要习惯用完就关掉
in1.close();
in2.close();
}
}
```
上面代码运行结果如图所示:
<img src="https://i.loli.net/2020/05/17/Bxt5UXKyWm1co3v.png" style="zoom:80%;" />
scanner工具中还有hasNextInt()、hasNextFloat()等方法验证输入的类型nextInt()、nextFloat()接收相关类型的输入。
> 拓展说明:
>
> `print()`和`println()`的区别:
>
> `println()`:输出完会换行
>
> `print()`:输出完不会换行,内容都输出在一行
>
>
## 顺序结构
JAVA的基本结构就是顺序结构除非特别指明否则就按照顺序一句一句执行。
顺序结构是最简单的算法结构。
<img src="https://i.loli.net/2020/05/17/z5DBQHsrjbfiJMC.png" style="zoom: 50%;" />
语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,<span style="color:red">它是任何一个算法都离不开的一种基本算法结构。</span>
## 选择结构
### `if`选择结构
#### `if`单选择结构
我们很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程在程序中用`if`语句来表示。
<img src="https://i.loli.net/2020/05/19/QfS8e5un3JXVdyk.png" style="zoom: 50%;" />
```java
if(布尔表达式){
//如果布尔表达式为true将执行的语句
}
```
#### `if`双选择结构
那现在有个需求公司要收购一个软件成功了给人支付100万元失败了自己找人开发。这样的需求用一个`if`就搞不定了,我们需要有两个判断,需要一个双选择结构,所以就有了`if-else`结构。
<img src="https://i.loli.net/2020/05/19/Ws7XgdF2jonTQfB.png" style="zoom: 67%;" />
```java
if(布尔表达式){
//如果布尔表达式为true将执行的语句
}else{
//如果布尔表达式为false将执行的语句
}
```
####`if`多选择结构
我们发现不管是单选择结构还是双选择结构都不符合实际情况真实的情况还可能存在ABCD存在区间多级判断。比如90-100就是A80-90就是B..等等,在生活中我们很多时候的选择也不仅仅只有两个,所以我们需要一个多选择结构来处理这类问题!
<img src="https://i.loli.net/2020/05/19/2NQ6qmIyFrUYE8i.png" style="zoom: 67%;" />
```java
if(布尔表达式1){
//如果布尔表达式1为true将执行的语句
}else if(布尔表达式2){
//如果布尔表达式2为true将执行的语句
}else{
//如果以上条件都不满足将执行的语句
}
```
####嵌套的`if`结构
使用嵌套的`if...else` 语句是合法的。也就是说你可以在另一个`if `或者`else if `语句中使用`if`或者`else if` 语句。你可以像`if `语句一样嵌套 `else if...else`。
**嵌套 if 语句**,只有当外层 if 的条件成立时,才会判断内层 if 的条件。
```java
if(布尔表达式1){
//如果布尔表达式1为true
if(布尔表达式2){
//如果布尔表达式2为true将执行的语句
}else{
//如果布尔表达式2为false将执行的语句
}
}else{
//如果布尔表达式1为false 将执行的语句
}
```
### `swich`多选择结构
多选择结构还有一个实现方式就是`switch case` 语句。
`switch case` 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
```java
switch(expression){
case value:
//语句
break;
case value:
//语句
break;
//可以有任意数量的case语句
default:
//语句
}
```
switch 语句中的变量类型可以是:
* byte、short、int 或者char。
* 从Java SE7开始`switch` 支持字符串 String 类型了,同时 `case`标签必须为字符串常量或字面量。
## 循环结构
### `while`循环
```java
while(布尔表达式){
//循环内容
}
```
* 只要布尔表达式为true循环就会一直执行下去。
* <span style="color : red">大多数情况是需要让循环停下来的,我们可以以让表达式失效的方式来结束循环。</span>
* 少部分情况需要循环一直执行,比如服务器的请求响应监听等。
* 循环条件一直为true就会造成无限循环(死循环),我们正常的业务编程中应该尽量避免死循环。会影响程序性能或者造成程序卡死奔溃!
### `do...while`循环
对于while 语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。
`do...while `循环和`while` 循环相似,不同的是,`do...while`循环至少会执行一次。
```java
do{
//代码语句
}while(布尔表达式);
```
While和do-While的区别
* `while`先判断后执行。`do…while`是先执行后判断!
* `do...while`总是保证循环体会被至少执行一次!这是他们的主要差别。
### `for`循环
虽然所有循环结构都可以用 while或者do..while表示但Java 提供了另一种语句-`for`循环,使一些循环结构变得更加简单。
<span style="color:red">for循环语句是支持迭代的一种通用结构是最有效、最灵活的循环结构。</span>
for循环执行的次数是在执行前就确定的。语法格式如下
```java
for(初始化;布尔表达式;迭代){
//代码语句
}
```
> 关于for循环的几点说明
>
> 1. 最先执行初始化步骤。可以声明一种类型,可初始化一个或多个循环控制变量,也可以是空语句。
>
> 2. 然后检测布尔表达式的值。如果为true循环体被执行。如果为false循环终止开始执行循环体后面的语句。
>
> 3. 执行一次循环后,更新循环控制变量(送代因子控制循环变量的增减)。
>
> 4. 再次检测布尔表达式。循环执行上面的过程。
#### 增强型`for`循环
在java5中引入了一种主要用于数组或集合的增强型for循环。
```java
for(声明语句 : 表达式){
//代码
}
```
* **声明语句**:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
* **表达式**:表达式是要访问的数组名,或者是返回值为数组的方法。
```java
public class ForDemo {
public static void main(String[] args) {
int[] ary = {10,20,30,40,50}; //定义一个数组
//遍历数组中的元素
for(int x : ary){
System.out.println(x);
}
}
}
```
## 跳转语句
### break
在任何循环语句的主体部分均可用break控制循环的流程。break用于<span style="color:red">强行退出循环,不执行循环中剩余的语句。</span>(break语句也在switch语句中使用)
### continue
continue 语句用在循环语句体中,用于<span style="color:red">终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。</span>