Java流程控制
用户交互Scanner
- Java提供了一个工具类来获取用户的输入。java.util.Scanner 是Java5的新特征,我们可以通过 Sanner 类来获取用户的输入。语法如下:
import java.util.Scanner;
Scanner s = new Scanner(System.in); //新建了一个Scanner s
- 通过Scanner类的next(), nextLine()方法可以获取输入的字符串,在读取前我们一般需要使用hasNext(), hasNextLine() 判断是否还有输入的数据。next()接收下一个有效数据,nextLine()接收下一行数据。Scanner是从IO流中读取数据,如果不关闭就会一直占用空间,所以每次使用完后使用close()方法手动关闭是一个好习惯。为了弄清楚一些关于Scanner的简单问题,看下面的示例程序:
import java.util.Scanner;
public class ScannerLearn {
public static void main(String[] args) {
//新建一个scanner
Scanner scanner = new Scanner(System.in);
//新建了一个字符串类接收用户的输入,示例输入Hello world!
String str = scanner.next(); //程序暂停等待我们输入
System.out.println(str); // 输出了“Hello”。
//str接收下一行数据
str = scanner.nextLine();
//程序没有暂停等待我们的输入,直接输出了,为什么?
System.out.println(str); //输出“ world!”
//str接收下一行数据
str = scanner.nextLine(); //程序暂停等待我们的输入
System.out.println(str); //程序输出“Hello world!"
scanner.close(); //关闭scanner
}
}
-
next()和nextLine() 两种方法的区别:
next():
- 一定要督导有效字符后才可以结束输入。
- 对输入有效字符前的空白,next()会自动将其去除。
- 只有输入有效字符后才会将其后面输入的空白作为分隔符或者结束符。
- next() 不能得到带有空格的字符串。
nextLine():
- 以回车为结束符,nextLine() 会回车之前的所有字符。
- 可以获得空白。
通过这两种方法的特性,我们就能够理解上面程序中出现的结果的原因了。第一个next()方法将"Hello world!"中间的空格作为了结束符,所以只输出了"Hello", 而最后一个nextLine() 返回整行,所以正确输出了"Hello world!"。那中间的nextLine()的输出又是怎么回事呢?以下仅仅作为帮助理解我们程序解释,实际编程中尽量不要让自己的程序出现这样的情况。
前面我们提到了Scanner类其实是从IO流中读取数据,这里我们简单的认为用户的输入全部储存在IO流中。我们第一次的输入的时候,我们可以认为IO流是空的,此时next()方法想要从中读取数据必须先等我们输入"Hello world!", 此时IO流中储存了"Hello woeld!"这个字符串,第一个next()方法以中间的空格为结束符,读到了"Hello", 为了便于理解,我们简单认为读取了的部分就从IO中删除了,此时IO流中剩下的数据为字符串" world!"。 然后程序向下执行到nextLine()方法,nextLine()发现此时IO流中还有数据,便不再等待用户输入,直接读取了剩余的一行数据,此时IO流为空。程序继续向下执行,遇到最后一个nextLine(),此时IO流中没有数据,所以程序又暂停等待用户输入。这是一个简单的解释,帮助我们理解程序的行为,如果有兴趣的朋友可以自己查阅相关的资料进行了解。
-
除了next(), nextLine()这两种方法意外,Scanner类还提供了许多其他的获取输入的方法,如nextInt(), nextDouble()等,对Java的一些基础数据类型作了一定的支持。这里不过多讲解,使用一个程序实例演示一小部分,有兴趣的朋友可以自己去学习。
import java.util.Scanner;
public class ScannerLearn {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt(); //下一个整数
double d = scanner.nextDouble(); //下一个小数
System.out.println("Int:" + i + ", Double: " +d );
//建议使用前检查输入数据类型,否者程序会报错
}
}
一. 顺序结构
- Java的基本结构就是顺序结构,除非特别指明,否者程序就会按照顺序一句一句执行。
- 顺序结构是最简单的算法结构。
- 语句与语句之间,框与框之间是按照从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,他是任何一个算法都离不开的一种基本算法结构。
二. 选择结构
-
if单选结构
很多时候我们需要先判断一个条件成立才会接着执行下面的操作,这样的过程我们可以用
if
语句表示,语法如下:if (boolean 表达式) { //布尔表达式为真时将要执行的语句 } //例子 int a = 6, b = 6; if (a == b) { System.out.println("a == b"); }
-
if双选择结构
我们有时不仅需要判断条件成立时的动作,还需要条件不成立时的动作,所以就有了if双选择结构 if else,语法如下:
if (boolean 表达式) { //布尔表达式为真时将要执行的语句 } else { //布尔表达式为假时的动作 } //例子 int a = 6, b = 6; if (a == b) { System.out.println("a == b"); } else { System.out.println("a != b"); }
-
if多选择结构
在实际情况中,我们还有可能出现多种情况需要的动作,比如成绩的优良中等等,所以if也有多选择结构 if elseif ... else,语法如下:
if (boolean 表达式1) { //布尔表达式1为true时的动作 } else if (boolean 表达式2) { //布尔表达式2为true时的动作 }else if (boolean 表达式3) { //布尔表达式3为true时的动作 } else if (boolean 表达式4) { //可以无限划分 } else {}
注意点:
-
if语句最多有一个else语句,且else语句一定在所有的else if语句之后
-
if语句可以有若干个else if语句,他们必须在else语句之前,在if语句之后。
-
if选择语句只会执行其中的一个或者不执行,当执行了其中的一个语句时,其他语句都将会跳过执行。
-
-
嵌套的if结构
if 语句可以嵌套,也就是说你可以在一个if语句或者else if语句中再次使用if判断语句。
if (boolean 表达式1) { if (boolean 表达式2) { //满足两个条件要执行的语句 } }
大家可以自己多多尝试,了解他的使用方法。
-
switch多选择结构
多选择非结构还有一个实现方式就是switch case语句。
switch case语句判断一个变量与一系列之中的某个值是否相等,每个值称为一个分支。相等的时便从相等处向后忽略判断,顺序执行代码。语法如下:
switch (expression) { case value1: //语句 break; //可选,所有break语句全部都是可选 case value2: //语句 break; //可选,所有break语句全部都是可选 //可以有任意个case语句块 default: //可选 //语句 }
switch 语句中的变量类型可以是:
- byte,short, int, char
- 从JavaSE 7 开始,switch支持字符串String类型。
- case标签必须是字符串常量或字面量。
关于switch case的说明:
- switch case 语句中的
break;
语句是可选的,有该语句时的执行过程和if else的逻辑相同,只会执行匹配的操作。如果不写break;
语句,则会发生case穿透现象,从匹配的位置向后忽略判断,顺序执行代码。 - switch case 语句中的
default;
语句是可选的,该语句作用类似于if else语句中的 else,作为没有匹配的默认选项,如果前面的case都没有匹配成功,则会执行default。 - switch case 语句从JDK8 开始支持字符串类型,原理是利用字符常量对象唯一的hash码进行查询匹配,实际上还是匹配数字。
关于switch case建议大家自己多写写尝试,就能弄清楚他是怎么执行的。