#+|Java控制语句


Java控制语句

  • Java选择语句if
    • Java switch选择语句
      • Java 循环语句
        • Java break语句
          • Java continue语句
            • Java return语句

#+|Java控制语句
文章图片

Java选择语句if 选择语句又称为分支语句,它通过对给定的条件进行判断,从而决定执行两个或多个分支中的哪一支。因此,在编写选择语句之前,应该首先明确判断条件是什么,并确定当判断结果为“真”或“假”时应分别执行什么样的操作/算法。在Java语言中选择语句主要提供了两个,一个是if语句,另一个则是switch语句。
#+|Java控制语句
文章图片

上图中第一种写法对应的原理图:#+|Java控制语句
文章图片

上图中第二种写法对应的原理图:
#+|Java控制语句
文章图片

上图中第三种写法对应的原理图:
#+|Java控制语句
文章图片

上图中第四种写法对应的原理图:
#+|Java控制语句
文章图片

if语句的任何一种形式在执行的时候只要有一个分支执行,则所对应的整个if语句就全部结束了,换句话说,对于一个独立的完整的if语句来说,最多只能有一个分支执行。
当分支中只有一条java语句话,大括号可以省略不写。

boolean sex = true; if(sex){ System.out.println("男"); }else{ System.out.println("女"); } //也可以这样写 if(sex) System.out.println("男"); else System.out.println("女");

示例:键盘接收一个学生的成绩,范围在[0-100],根据成绩判断等级,[90-100]等级为“优秀”,[80-90)等级为“良好”,[70-80)等级为“中等”,[60-70)等级为“及格”,[0-60)等级为“大笨蛋”,输入其它数字表示成绩不合法。
//方案一 java.util.Scanner scan = new java.util.Scanner(System.in); System.out.print("输入考试成绩:"); int score = scan.nextInt(); if(score < 0 || score > 100){ System.out.println("对不起,您输入的成绩不合法!"); }else if(score >= 90 && score <= 100){ System.out.println("成绩等级:优秀"); }else if(score < 90 && score >= 80){ System.out.println("成绩等级:良好"); }else if(score < 80 && score >= 70){ System.out.println("成绩等级:中等"); }else if(score < 70 && score >= 60){ System.out.println("成绩等级:及格"); }else if(score < 60 && score >= 0){ System.out.println("成绩等级:大笨蛋"); }

//方案二 java.util.Scanner scan = new java.util.Scanner(System.in); System.out.print("输入考试成绩:"); int score = scan.nextInt(); String grade = "大笨蛋"; if(score < 0 || score > 100){ grade = "对不起,您输入的成绩不合法!"; }else if(score >= 90){ grade = "优秀"; }else if(score >= 80){ grade = "良好"; }else if(score >= 70){ grade = "中等"; }else if(score >= 60){ grade = "及格"; } System.out.println("成绩等级:" + grade);

Java switch选择语句 #+|Java控制语句
文章图片

#+|Java控制语句
文章图片

switch运行原理文字性描述是这样的(以上图为例):拿着c和表达式1进行比较,如果相等,则执行语句1,如果不相等,继续拿着c和表达式2进行比较,如果相等,则执行语句2,如果不相等,继续…,如果c和所有的分支表达式都不相等,此时default分支“语句n+1”则执行。
使用switch语句的一些注意事项
(1)switch语句后面的小括号“()”当中都可以出现什么,在JDK1.6之前(包括1.6在内)switch只能探测int类型的数据,但是在JDK1.7之后(包括1.7在内),switch语句除了支持int类型之外,还支持String类型。也就是说从Java7开始switch后面小括号中可以出现字符串。
(2) switch虽然只能探测int类型,但是也可以将byte,short,char类型放到小括号当中,因为这些类型会自动转换成int类型(小容量向大容量转换称为自动类型转换)。
(3) switch语句当中case是可以进行合并的。
(4) switch语句当中当某个分支匹配成功,则开始执行此分支当中的java语句,当遇到当前分支中的“break; ”语句,switch语句就结束了,但是如果当前分支中没有“break; ”语句,则会发生case穿透现象,也就是说下一个分支也不再进行匹配,直接进入下一个分支执行,直到遇到“break; ”为止。

示例:键盘接收一个学生的成绩(假设成绩是合法的),范围在[0-100],根据成绩判断等级,[90-100]等级为“优秀”,[80-90)等级为“良好”,[70-80)等级为“中等”,[60-70)等级为“及格”,[0-60)等级为“大笨蛋”。只允许使用switch,不允许使用if语句。
java.util.Scanner scan = new java.util.Scanner(System.in); System.out.print("请输入考试成绩[0-100]:"); double score = scan.nextDouble(); String grade = "大笨蛋"; switch((int)(score / 10)){ case 10: case 9: grade = "优秀"; break; case 8: grade = "良好"; break; case 7: grade = "中等"; break; case 6: grade = "及格"; break; } System.out.println("成绩等级为:" + grade);

Java 循环语句
for循环语句
for循环的语法格式:
#+|Java控制语句
文章图片

for循环的执行顺序以及原理如下:
#+|Java控制语句
文章图片

对于for循环来说,初始化表达式、布尔表达式、更新表达式都不是必须的,当布尔表达式缺失的时候,没有条件控制的前提下,会形成死循环。
关于for循环的使用我们还需要注意初始化变量的作用域,在for循环当中声明的变量只在for循环中有效,当for循环结束之后,初始化变量的内存就释放了/消失了,所以在for循环之外是无法访问该变量的,例如以下代码在编译的时候就会报错了:
//在for循环内部声明的变量i只在for循环中可见/有效 for(int i = 1; i <= 10; i++){ System.out.println("i = " + i); } //这行编译报错,i变量不存在 System.out.println("i = " + i);

修改后:
public static void test(){ //变量的声明位置放到了for循环之外 int i = 1; for(; i <= 10; i++){ System.out.println("i = " + i); } //这里就可以访问变量i了 System.out.println("i = " + i); }

因为i变量的作用域已经被扩大了,不再只是for循环中可以使用,for循环之外也可以使用,换句话说,以上的for循环结束之后i变量的内存并不会被释放。后续的程序可以继续使用。i变量的作用域是在整个test()方法中都有效,直到test()方法执行结束的时候才会释放i变量的内存空间。
示例1:求和就是将1~100的每一个整数累加
int sum = 0; for(int i = 1; i <= 100; i++){ sum += i; } System.out.println("sum = " + sum);

示例2:实现1~100所有奇数的和
//第一种 int sum = 0; for(int i = 1; i <= 100; i++){ if(i % 2 != 0){ sum += i; } } System.out.println("sum = " + sum);

//第二种 int sum = 0; for(int i = 1; i < 100; i += 2){ sum += i; } System.out.println("sum = " + sum)

循环当中可以嵌套循环吗?
当然可以,之前我们就说过所有控制语句都是可以嵌套使用的,当循环A中嵌套循环B的时候就等于在A循环体中的代码是B循环。其实大家在学习循环嵌套的时候完全没必要特殊化对待,完全可以把A循环体当中的B循环看做是一段普通的java代码。
//循环5次(B循环) for(int i = 1; i <= 5; i++){ System.out.print("i = " + i + ","); }System.out.println(); //循环2次(A循环) for(int j = 1; j <= 2; j++){ System.out.print("j = " + j + ","); }System.out.println(); //将B循环放到A循环体当中 for(int j = 1; j <= 2; j++){ //A循环(2次) for(int i = 1; i <= 5; i++){ //B循环(5次)System.out.print("i = " + i + ","); } }

#+|Java控制语句
文章图片

#+|Java控制语句
文章图片

#+|Java控制语句
文章图片

示例3:打印九九乘法表
for (int i = 1; i <= 9; i++) { for (int j = 1; j <= i; j++) { System.out.print(i + "*" + j + "=" + i * j + " "); } System.out.println(); }

#+|Java控制语句
文章图片

Java while语句
#+|Java控制语句
文章图片
#+|Java控制语句
文章图片

while循环的执行原理可以得出while循环的循环体执行次数可能是0次,也可能是N次。
示例:计算1~100所有偶数的和
int sum = 0; int i = 0; while(i <= 100){ if(i % 2 == 0){ sum += i; } i++; } System.out.println("sum = " + sum); sum = 0; int j = 0; while(j <= 100){ sum += j; j += 2; } System.out.println("sum = " + sum);

#+|Java控制语句
文章图片

Java do while语句
#+|Java控制语句
文章图片

#+|Java控制语句
文章图片

示例:使用的一个系统的时候需要登录,假设用户名或者密码记不清楚了,你是不是需要不断的“反复的”输入用户名和密码。
java.util.Scanner scanner = new java.util.Scanner(System.in); String username; String password; do{ System.out.print("用户名:"); username = scanner.next(); System.out.print("密码:"); password = scanner.next(); }while(!username.equals("admin") || !password.equals("123")); System.out.println("登录成功,欢迎" + username + "回来!");

#+|Java控制语句
文章图片

解释以上程序:先提示用户输入用户名和密码,然后判断用户名和密码,当用户名不是admin或者密码不是123的时候继续提示用户输入用户名和密码,直到用户输入的用户名是admin并且密码是123的时候循环结束,循环结束之后输出登录成功的信息,只要循环没有结束就表示用户名和密码还是不对,当然,在现实的系统当中我们不可能允许用户无限制的输入用户名和密码,通常会给几次输入机会,当机会用完之后还是没有登录成功,通常该账户就被锁定了。
总之while和do…while循环的区别就在于do…while会先执行一次循环体,然后再判断条件,这样do…while的循环体至少执行一次。而while循环则是先判断条件是否合法,如果不合法,则循环体就没有任何执行的机会。while循环体执行次数是0N次,但是do…while循环体执行次数则是1N次。
Java break语句 使用break这一个单词就可以在java语言中自成一条java语句,break语句的编写很简单,例如“break; ”,那么它可以用在哪里呢?首先它可以使用在switch语句当中,用来终止switch语句的执行。
break语句重点是使用在循环语句当中,用来终止/跳出循环
for(int j = 1; j <= 2; j++){ for(int i = 1; i <= 10 ; i++){ if(i == 5){ break; } System.out.println("i = " + i); } }

#+|Java控制语句
文章图片

first:for(int j = 1; j <= 2; j++){ for(int i = 1; i <= 10 ; i++){ if(i == 5){ break first; } System.out.println("i = " + i); } }

#+|Java控制语句
文章图片

当多层循环嵌套的时候,可以给每个循环设置标识,例如:first:for…、second:for…,当某个条件成立时,想终止指定循环的话,可以这样做:break first; 或者break second; ,这样指定的循环就结束了
Java continue语句 continue语句也是单个单词自成一条java语句,例如“continue; ”,它和break语句都是用来控制循环的,break语句是用来终止循环的执行,而continue语句则是用来终止当前本次循环,直接进入下一次循环继续执行。
for(int i = 1; i <= 10; i++){ if(i == 5){ break; } System.out.println("break : i = " + i); }System.out.println("----------------------"); for(int i = 1; i <= 10; i++){ if(i == 5){ continue; } System.out.println("continue : i = " + i); }

【#+|Java控制语句】#+|Java控制语句
文章图片

#+|Java控制语句
文章图片

总之,break用来终止循环,continue用来中断当前本次循环,直接进入下一次循环继续执行。
Java return语句 return关键字并不是专门用于结束循环的,return语句用于终止函数的执行或退出类的方法,并把控制权返回该方法的调用者。如果这个方法带有返回类型,return语句就必须返回这个类型的值;如果这个方法没有返回值,可以使用没有表达式的 return语句。
return语句的一般语法格式如下:return 与方法相同类型的变量;
示例:当用户输入两个 double 类型的数值后需要计算这两个数值之和,而这两个操作数是可以变动的,但是求和的功能是不变的,这时就需要定义一个方法,只要在需要求和时调用该方法即可,该方法将计算之后的结果返回。
import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner input = new Scanner(System.in); System.out.println("请输入操作数1:"); double num1 = input.nextDouble(); // 获取用户输入的操作数1 System.out.println("请输入操作数2:"); double num2 = input.nextDouble(); // 获取用户输入的操作数2 double d = sum(num1, num2); System.out.println(num1 + "+" + num2 + "=" + d); } /** * 创建sum() 方法,返回double 类型的数值 * * @param i 操作数1 * @param j 操作数2 * @return 两个操作数之和 */ public static double sum(double i, double j) { double sum = i + j; return sum; } }

当用户输入两个 double 类型的数值后,程序调用 sum() 方法。该方法有两个参数,分别表示用户输入的操作数 1 和操作数 2。在调用该方法时,只需要将用户输入的两个数值传递过去即可,然后程序会执行 sum() 方法,对这两个数求和,并使用 return 语句将计算得出的结果返回。
在 main() 方法中,同样需要使用 double 类型的变量来接收 sum() 方法返回的值,即变量 d 为计算后的结果。
#+|Java控制语句
文章图片

    推荐阅读