Java流程控制
用户交互Scanner
Scanner 对象
介绍
Java给我们提供了一个工具类,我们可以通过它获取用户的输入,java.util.Scanner
是Java 5 的新特性,我们可以通过这个类进行获取用户的输入
基本语法
Scanner s = new Scanner(System.in);
通过Scanner类的
next()
和nextLine()
方法发货区输入的字符串,在读取前我们一般需要使用hasNext()
和hasNextLine()
判断是否还有输入的数据。
package com.zy.scanner;
import java.util.Scanner;
public class Demo() {
public static void main(String[] args) {
//创建一个扫描器对象,用来接受键盘数据
Scanner scanner = new Scanner(System.in);
System.out.print("使用next方式接收:");
//判断用户是否输入字符串
if(scanner.hasNext()) {
//使用next()方法进行接收
String str = scanner.next();
System.out.print("输入的内容为:" + str);
}
scanner.close(); //很重要很重要
}
}
这里使用next()
进行接收的话,比如我输出hello world
时,程序的运行结果是hello
,而不是hello world
,说明这个方法只能接收我这里空格前的hello
,如果要把hello world
全部接收需要使用nextLine()
方法才可以实现。
注意:要养成良好的习惯,在用完IO流的类时一定要用close()方法关掉,否则会一直占用资源
这里讲解一下这两个方法的区别:
next():
- 一定要读取到有效的字符后才可以结束输入
- 对输入有效之前遇到的空白,
next()
方法会自动去掉 - 只能输入有效字符后才将其后面输入的空白作为分隔符或者结束符
next()不能得到带有空格的字符串
这就是为什么上面的程序只能读到
hello
的原因
nextLine():
- 以Enter(回车键)作为结束符,所以
nextLine()
方法返回的是输入回车之前的所有字符 - 可以得到空白的内容
package com.zy.scanner;
import java.util.Scanner;
public class Demo() {
public static void main(String[] args) {
//创建一个扫描器对象,用来接受键盘数据
Scanner scanner = new Scanner(System.in);
System.out.print("请输入数据:");
String str = scanner.nextLine();
System.out.print("输入的内容为:" + str);
scanner.close(); //很重要很重要很重要很重要很重要很重要很重要很重要
}
}
上面讲述的都是String(字符)类型的输入,我们来讲一下数值类型的输入该怎么使用
package com.zy.scanner;
import java.util.Scanner;
public class Demo() {
public static void main(String[] args) {
//创建一个扫描器对象,用来接受键盘数据
Scanner scanner = new Scanner(System.in);
int i = 0;
System.out.print("请输入整数:");
//如果输入的是整数,则进行赋值并输出
if(scanner.hasNextInt()) {
i = scanner.nextInt();
System.out.print("输入的内容为:" + i);
}
scanner.close(); //很重要很重要很重要很重要很重要很重要很重要很重要
}
}
我们这里使用hasNextInt()
去判断我们输入的是否为整数,并使用nextInt()
方法进行数据的接收
还有很多种方法去接收不同的数据如
scanner.nextLong();
scanner.nextShort();
scanner.nextDouble();
scanner.nextByte();
scanner,nextFloat();
scanner.nextBigInteger();
scanner.nextBoolean();
...........
我们可以使用判断数据方法和接收方法去实现各种功能
顺序结构
- Java的基本结构就是顺序结构,除非特别指明,否则都是按顺序执行
- 顺序结构也是最简单的算法结构
- 它是由若干个依次执行的处理步骤组成的,任何一个算法都离不开顺序结构
package com.zy.scanner;
import java.util.Scanner;
public class Demo() {
public static void main(String[] args) {
System.out.print("1");
System.out.print("2");
System.out.print("3");
System.out.print("4");
System.out.print("5");
}
}
上面的程序会按照顺序执行,所以结果是12345
难点都是在后面的选择结构和循环结构,而且顺序结构我也感觉没什么好讲的,就是根据语句的顺序去执行,所以直接进入下一个内容
选择结构
if 单分支结构
很多情况下我们需要去判断某个条件是否为真,然后才选择是否执行语句,所以我们可以使用if语句来进行判断
- 语句
if(布尔表达式) {
//结果为true则执行if里面的语句
}
用实例来讲解一下
package com.zy.scanner;
import java.util.Scanner;
public class Demo() {
public static void main(String[] args) {
//创建一个扫描器对象,用来接受键盘数据
Scanner scanner = new Scanner(System.in);
int i = 0;
System.out.print("请输入整数:");
//如果输入的是整数,则进行赋值并输出
if(scanner.hasNextInt()) {
i = scanner.nextInt();
System.out.print("输入的内容为:" + i);
}
scanner.close(); //很重要很重要很重要很重要很重要很重要很重要很重要
}
}
这个是我们前面用到的代码,可以看到我们在输入之前判断了用户是否输入了字符串,这里的布尔表达式就是scanner.hasNextInt()
这个方法的返回值是布尔类型,也就是真与假,刚开始学习不太熟练的话可以写成scanner.hasNextInt()==true
,或者你想实现输入的不是整数才进行接受数据可以写成scanner.hasNextInt()!=true
或者scanner.hasNextInt()==false
都是可以的。
if 双分支结构
很多情况下我们需要去判断某个条件是否为真,然后才选择是否执行语句,否则我们将执行另一个语句
- 语法
if(布尔表达式) {
//结果为true则执行if里面的语句
} else {
//结果为false则执行else里面的语句
}
举一个贴近生活的例子
package com.zy.scanner;
import java.util.Scanner;
public class Demo() {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入天气:");
String weather = scanner.hasNext();
//equals方法用于比较两个字符串是否相等
if(weather.equals("晴天") {
System.out.print("出去打球");
} else {
System.out.print("在家睡大觉");
}
scanner.close(); //很重要很重要很重要很重要很重要很重要很重要很重要
}
}
可以看到,如果我们输入的是晴天,程序就会输出 出去打球 ,输入其他的则会输出 在家睡大觉,用于判断两种情况的选择,主要是考虑 if 里面的条件,其余条件都不用考虑,直接交给 else 去执行
if 多分支结构
当我们遇到需要考虑的条件比较多的时候,就可以用到多分支结构
还是刚刚的例子,但是我们修改一下
package com.zy.scanner;
import java.util.Scanner;
public class Demo() {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入天气:");
String weather = scanner.hasNext();
//equals方法用于比较两个字符串是否相等
if(weather.equals("晴天") {
System.out.print("出去打球");
} else if(weather.equals("雨天"){
System.out.print("在家睡大觉");
} else if(weather.equals("台风") {
System.out.prin("紧锁并加固门窗");
} else {
System.out.print("看书");
}
scanner.close(); //很重要很重要很重要很重要很重要很重要很重要很重要
}
}
这里我们通过多分支语句结构去实现了更多的选择,比如晴天、雨天、台风以及其他天气
嵌套if结构
有些时候我们需要多重判断,要进行多次判断才能得到想要的结果,那应该怎么去实现呢?
可以使用嵌套的if语句去帮我们进行判断
package com.zy.scanner;
import java.util.Scanner;
public class Demo() {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入天气:");
String weather = scanner.hasNext();
System.out.print("请输入星期:");
String week = scanner.hasNext();
//equals方法用于比较两个字符串是否相等
if(weather.equals("晴天") {
if(week.equals("星期日") {
System.out.print("出去打球");
}
}
//这里可以搭配else if 和 else 去使用,我比较懒,不想写太多
scanner.close(); //很重要很重要很重要很重要很重要很重要很重要很重要
}
}
这个程序通过判断今天是晴天,并且是星期天的话就出去打球,嵌套if 语句可以多重嵌套,所以不止我这里写的两个,可以多个,不过最好还是别超过五个,也可以搭配else if 和 else 去实现更多更复杂的判断,这里根据自己的需要可以去尝试一下。
switch多选择结构
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
switch(expression){
case value :
//语句
break; //可选
case value :
//语句
break; //可选
//你可以有任意数量的case语句
default : //可选
//语句
}
switch case 语句有如下规则:
-
switch 语句中的变量类型可以是: byte、short、int 或者 char。从 Java SE 7 开始,switch 支持字符串 String 类型了,同时 case 标签必须为字符串常量或字面量。
-
switch 语句可以拥有多个 case 语句。每个 case 后面跟一个要比较的值和冒号。
-
case 语句中的值的数据类型必须与变量的数据类型相同,而且只能是常量或者字面常量。
-
当变量的值与 case 语句的值相等时,那么 case 语句之后的语句开始执行,直到 break 语句出现才会跳出 switch 语句。
-
当遇到 break 语句时,switch 语句终止。程序跳转到 switch 语句后面的语句执行。case 语句不必须要包含 break 语句。如果没有 break 语句出现,程序会继续执行下一条 case 语句,直到出现 break 语句。
-
switch 语句可以包含一个 default 分支,该分支一般是 switch 语句的最后一个分支(可以在任何位置,但建议在最后一个)。default 在没有 case 语句的值和变量值相等的时候执行。default 分支不需要 break 语句。
switch case 执行时,一定会先进行匹配,匹配成功返回当前 case 的值,再根据是否有 break,判断是否继续输出,或是跳出判断。
实例:
public class Test {
public static void main(String args[]){
char grade = 'D';
switch(grade)
{
case 'A' :
System.out.println("优秀");
break;
case 'B' :
case 'C' :
System.out.println("良好");
break;
case 'D' :
System.out.println("及格");
break;
case 'F' :
System.out.println("不及格");
break;
default :
System.out.println("输入错误");
}
System.out.println("你的评分是 " + grade);
}
}
输出结果:
及格
你的评分是 D
这里可以看到,如果grade是’A’的话,会输出优秀
并且break,跳出switch语句,直接输出 你的评分是 A
,如果是B的话,可以发现里面并没有语句,也没有break,所以它会执行C里面的语句并且break,说明B和C 都是属于良好,最后的default就是跟else差不多的作用,除了上面那几个选项外,其他输出都会被输出 输入错误
break这个语句在后面循环结构中会详细讲解,这里先简单带过,留个印象就行,知道它是跳出switch语句和循环的作用就可以了。
总结
这一篇的内容主要讲解了Scanner对象进行用户交互和三大结构中的顺序、选择结构,顺序是基本的,而选择和循环都是必不可少的,这三个结构组成了我们的编程世界,今后我们会一直用到选择和循环去帮我们实现很多功能,所以一定要学好这两个结构,顺序结构的话不用学也能明白的,因为就是按顺序去执行而已。