一、流程控制
在进行后面复习之前,要永远记住一句话,在没有任何控制程序的加持下,程序的运行时自上而的顺序依次运行,没有例外!
1、赋值语句
字面意思:在一个表达式中当一个值赋给某个变量后,这个表达式就成一个赋值语句.
值得注意的是 java 中不单单只有进行数值运算才可进行赋值, 其实创建的对象的过程也是可以看成赋值的过程.
最容易混淆的点是:java 的赋值运算符是 = ;但是它不等同数学中的等号,在java中(其他语言) = 属于赋值运算符 , 而 java 中的 == 才可以近似看成数学中的等号,在java中 == 长用作 判断两个操作数是否相等,不单单是等于;
2、分支语句
①if...else...
语法格式:
if(条件表达式){
语句1;
}else{
语句2;
}
当然 if...else... 不仅仅只是这样固定的方式,它随着程序员的需求有不同的表现形式:
1 1 public class Test06 { 2 2 3 3 public static void main(String[] args) { 4 4 5 5 int x = 3; 6 6 int y = 4; 7 7 8 8 // 第一种表现形式 9 9 if (x == y) { 10 10 System.out.println("true"); 11 11 }else { 12 12 System.out.println("false"); 13 13 } 14 14 // output result: false; 15 15 16 16 // 第二种表现形式 17 17 if (x != y) { 18 18 System.out.println("true"); 19 19 } 20 20 // output result: true; 21 21 22 22 // 第三种表现形式 23 23 if(x == y) { 24 24 System.out.println("true"); 25 25 } 26 26 else if(x < y){ 27 27 System.out.println("true"); 28 28 }else { 29 29 System.out.println("false"); 30 30 } 31 31 // output result: true; 32 32 // 第三中表现形式可以不断的增加 else if 33 33 // 从输出结果可以看出,当分支程序的条件表达式的 result 一 34 34 // 直是 false 则不断的往下继续判断剩余的分支程序else 终止 35 35 // 当一个分支程序一段分支的条件表达式的 result 是true,则输 36 36 // 出该分支程序的值,剩余的分支段不执行 37 37 } 38 38 }
if...else...还有一个重点与难点:关于 if 语句的嵌套:
1 public class Test06 { 2 3 public static void main(String[] args) { 4 5 int x = 3; 6 int y = 4; 7 8 if (x != y) { 9 if (x < y) { 10 System.out.println("完全正确"); 11 }else { 12 System.out.println("部分正确"); 13 } 14 }else { 15 System.out.println("完全错误"); 16 } 17 // output result: 完全正确 18 19 if (x != y) { 20 if (x > y) { 21 System.out.println("完全正确"); 22 }else { 23 System.out.println("部分正确"); 24 } 25 }else { 26 System.out.println("完全错误"); 27 } 28 // output result: 部分正确 29 30 if (x == y) { 31 if (x > y) { 32 System.out.println("完全正确"); 33 }else { 34 System.out.println("部分正确"); 35 } 36 }else { 37 System.out.println("完全错误"); 38 } 39 // output result: 完全错误 40 } 41 }
②switch语句
switch(表达式){
case c1:
语句组1;
break;
case c2:
语句组2;
break;
default
语句组;
break;
}
注意: switch 中的表达式的计算结果必须是 int 型或 char 型(short 与 byte 的使用要提升). 禁止使用浮点型与 long 型,并且 switch 中的表达式是与 case 中的 c1... 进行关系运算
1 1 import java.util.*; 2 2 3 3 public class Test07 { 4 4 5 5 public static void main(String[] args) { 6 6 7 7 for(int i = 0; i < 10;++i) { 8 8 Scanner s = new Scanner(System.in); 9 9 int x = s.nextInt(); 10 10 11 11 // switch (x ==y) { // 这样的表达式是错误的:因为这个表达式不是条件表达式,这个表达式是与下面的任何 case 进行关系运算 12 12 switch (x) { 13 13 case 1: 14 14 System.out.println("今天是星期一"); 15 15 break; 16 16 17 17 case 2: 18 18 System.out.println("今天是星期二"); 19 19 break; 20 20 21 21 case 3: 22 22 System.out.println("今天是星期三"); 23 23 break; 24 24 25 25 default: 26 26 System.out.println("都没有"); 27 27 break; 28 28 } 29 29 } 30 30 } 31 31 }
这个程序中有两个没有见到过的关键字: break 和 default:
1、 default: 表示在 switch 语句中 任何一个 case 都没有与之相对应的结果,则进入 default 执行语句组,其实与 if 语句的 else 的本质相同;
这里产生了一个疑问, default 放置在 switch 语句中任何位置对整个程序有什么影响?
default 放置在任何的位置(switch 的首位置),判断其对switch语句的影响取决于 break 与 switch - case 之间的判断结果:
① 如果没有 break 且 witch - case 之间的判断结果为假 -------------> 输出 default 的语句组且往下继续执行输出与 default 最近的 case 语句组
② 如果有 break 且 witch - case 之间的判断结果为假 ----------------> 输出 default 的语句组
③ 如果有break 且 witch - case 之间的判断结果为真 -----------------> 不输出 default 的语句组,而是输出真值
④ 如果没有break 且 witch - case 之间的判断结果为真 --------------> 不输出 default 的语句组,而是输出真值
2、break :(1).结束当前整个循环,执行当前循环下边的语句.忽略循环体中任何其它语句和循环条件测试.
(2).只能跳出一层循环,如果你的循环是嵌套循环,那么你需要按照你嵌套的层次,逐步使用break来跳出。[逐层判断,逐步跳出]
1 public class Test08 { 2 3 public static void main(String[] args) { 4 5 int k = 0; 6 int sum = 0; 7 8 for (int a = 0 ; a < 20; a++) { 9 k += a; 10 for(int b = 1; b < 5; b ++) { 11 sum += b; 12 break; // 此处的break 结束 for(b) 的循环,并直接往下执行 13 } 14 // break; 15 System.out.println(sum); // 上一行的 break 执行 已经结束了 整一个 for(a) 循环,所有在其后面再加入语句则会编译错误 16 break; // 此处的break 结束 for(a) 的循环,并直接往下执行 17 } 18 System.out.println(k); 19 System.out.println(sum); 20 } 21 } 22 // output result: 1 0 1
(3).break在循环体内,强行结束循环的执行,也就是结束整个循环过程,不在判断执行循环的条件是否成立,直接转向循环语句下面的语句。
1 package Review; 2 3 public class Test08 { 4 5 public static void main(String[] args) { 6 int sum = 0; 7 for (int a = 0 ; a < 20; a++) { 8 9 sum += a; 10 break; 11 } 12 System.out.println(sum); 13 } 14 }
(4).当break出现在循环体中的switch语句体内时,其作用只是跳出该switch语句体。 总的来说:就近原则,结束当前的整个判断。
1 import java.util.*; 2 3 public class Test07 { 4 5 public static void main(String[] args) { 6 7 for(int i = 0; i < 10;++i) { 8 Scanner s = new Scanner(System.in); 9 int x = s.nextInt(); 10 11 switch (x) { 12 case 1: 13 System.out.println("今天是星期一"); 14 15 case 2: 16 System.out.println("今天是星期二"); 17 break; 18 19 case 3: 20 System.out.println("今天是星期三"); 21 break; 22 23 default: 24 System.out.println("都没有"); 25 } 26 } 27 } 28 } 29 30 /* output result: 31 1 32 今天是星期一 33 今天是星期二 34 */
switch 的综合性程序:
1 import java.util.*; 2 3 public class Test09 { 4 5 public static void main(String[] args) { 6 7 8 // 输入一个成绩 判断它成绩再哪个阶段 9 for(int i = 0; i < 100; i++) { 10 Scanner s = new Scanner(System.in); 11 int grade = s.nextInt(); 12 13 if (grade <= 100 && grade >= 0) { 14 15 int x1 = grade / 10; 16 17 switch(x1) { 18 19 case 9: case 10: 20 System.out.println("优秀!"); 21 break; 22 case 8: 23 System.out.println("优良"); 24 break; 25 case 7: 26 System.out.println("良"); 27 break; 28 case 6: 29 System.out.println("及格"); 30 break; 31 default: 32 System.out.println("拖出去宰了"); 33 break; 34 } 35 }else{ 36 System.out.println("输入错误"); 37 } 38 } 39 } 40 }
3、循环语句
for 语句
语句的表达式:
for(初始语句; 条件表达式;迭代语句){
循环体语句;
}
关于 for 循环与 if 语句的嵌套使用代码程序:
1 /** 2 * 银行账户取钱程序(输入账户最多三个,输入密码最多三次,取钱取到没钱为止) 3 * */ 4 import java.util.*; 5 6 import java.math.*; 7 8 public class Test10 { 9 10 public static void main(String[] args) { 11 12 String cs = "no"; 13 String k = "yes"; 14 15 int y = 80000; 16 17 String account = "cheng"; // 账号 18 String password = "1"; // 密码 19 20 System.out.print("请输入你的账户:" ); 21 Scanner s = new Scanner(System.in); 22 String str = s.next(); // 23 24 // 循环账户重复输入 25 for(int i =0; i < 3; ++i) { 26 27 // 判断账户输入是否正确 28 if (str.equals(account) == true) { 29 30 System.out.print("请输入你的密码:" + " "); 31 Scanner sc = new Scanner(System.in); 32 String stri = sc.next(); 33 34 // 循环密码重复输入 35 for ( int j = 0; j < 3; j++) { 36 37 // 判断密码输入是否正确 38 if (stri.equals(password) == true) { 39 40 System.out.println("你的账户余额有:" + y); 41 System.out.print("请输入你要取出的金额:" ); 42 43 Scanner sca = new Scanner(System.in); 44 int amount = sca.nextInt(); 45 46 int p = y / 100; 47 int balance = y - amount; 48 49 System.out.println("你的账户余额有" + balance); 50 51 // 判断账户余额是否为0 52 if (balance <= 0) { 53 System.out.println("你的银行卡没有money,你个穷屌丝"); 54 System.out.println("银行卡已退出,请取走你的银行卡"); 55 break; 56 } 57 58 // 循环取钱次数 59 for(int g = 0; g < p - 1; ++g) { 60 61 System.out.print("你是否还需再取出金额: " ); 62 Scanner scan = new Scanner(System.in); 63 String strin= scan.next(); 64 65 // 判断是否要继续取钱 66 if(strin.equals(k)) { 67 68 System.out.print("请再次输入你要取出的金额:" ); 69 amount = sca.nextInt(); 70 balance = balance - amount; 71 72 // 判断账户金额是否为0 73 if (balance <= 0) { 74 System.out.println("你的银行卡没有money,你个穷屌丝"); 75 System.out.println("银行卡已退出,请取走你的银行卡"); 76 break; 77 }else { 78 System.out.println("你的账户余额有" + balance); 79 } 80 }else if (strin.equals(cs)) { 81 System.out.println("银行卡已退出,请取走你的银行卡"); 82 }else { 83 System.out.println("小鬼, 你连 yes 和 no 都打不清 还想继续取钱 没门"); 84 break; 85 } 86 break; 87 } 88 89 break; 90 }else if (j < 2) { 91 System.out.print("请再次输入你的密码:" ); 92 stri = sc.next(); 93 94 }else { 95 System.out.println("密码输入次数太多,请取回卡!"); 96 break; 97 } 98 } 99 break; 100 }else if ( i < 2) { 101 System.out.print("请再次输入你的账户:" ); 102 str = s.next(); 103 104 }else { 105 System.out.println("账户输入超时,请取回卡!"); 106 break; 107 } 108 } 109 } 110 }
while 语句
语句表达式:
while(条件表达式){
循环体语句;
}
while 与 for 都是相同的循环体结构,并且两者都可以相互的转换使用,但是两者还是有些许区别:
从结构上可以可以看出,for 中有更多的语句,使得 for 循环的可读性更高;
从应用上来看,for 多用于循环次数明确的场景,while 多用于循环次数不够明确的场景,并且 while 的条件表达式,只要它的判定是 true 他就会一直无限的执行下去;而 for 循环都是条件表达式明确的
1 public class Test12 { 2 3 public static void main(String[] args) { 4 5 int sum01 = 0; 6 int sum02 = 0; 7 // for 循环 8 for(int i = 0; i<10; i++){ 9 sum01 += i; 10 System.out.print(sum01 + " "); 11 } 12 //System.out.println(sum01); 13 System.out.println(); 14 System.out.println("-------------------"); 15 16 int j = 0; 17 while (true){ 18 sum02 += j; 19 ++j; 20 System.out.print(sum02 + " "); 21 } 22 //System.out.println(sum02); 23 } 24 }
do...while...
语法表达式:
do{
语句;
}while(条件表达式);
从这个 do...while... 的语法格式,与程序顺序执行 可以看出 do...while... 的执行顺序是先执行语句然后进行判断,为真 返回上级继续执行,为假结束执行,也就是说无论 while 的判断是否真假, do...while...
都会先执行出语句内容;
1 public class Test13 { 2 3 public static void main(String[] args) { 4 5 int i = 1; 6 int sum = 0; 7 do { 8 sum += i; 9 i++; 10 }while(i < 10); 11 12 System.out.println(sum); 13 14 int j = 1; 15 int sum01 = 0; 16 do { 17 sum01 += j; 18 j++; 19 }while(j < -1); // 该循环体先执行语句,在执行 while 的条件表达式 20 System.out.println(sum01); 21 } 22 }
break 与 continue 的用法 与 区别
break的用法:
1、在 switch 与 循环体中 break 的作用是跳过本语句块中余下的所有语句,转到块尾,执行其后的语句;
1 public class Test14 { 2 3 public static void main(String[] args) { 4 5 for(int i = 0; i < 10; i++){ 6 System.out.print("你好!" + " "); 7 break; 8 } 9 10 System.out.println("大家好!"); 11 // output result: 你好! 大家好! 12 // 该程序添加 break 与不添加的区别;不添加 break 则 for 循环会一直执行到条件表达式为假为止,则输出结果将会为: 13 // 你好!(10 次输出) 大家好! 14 // 而添加 break 后,程序顺序执行到 break 后直接跳出 for 循环执行后面的语句;输出结果为: 15 // 你好!(1 次输出)大家好! 16 17 System.out.println(); 18 19 /*for(int i = 0; i < 10; i++) { 20 break; 21 System.out.print("你好!" + " "); // Unreachable statement : 不能达到的声明 22 } 23 System.out.println("大家好!"); */ 24 // 如果 break 放在 for 循环的执行语句前呢? 25 // 很明显程序直接在编译阶段出现了 error: 无法访问 18 行的执行代码;所以这种代码方式是错误的,不能这样书写; 26 27 for(int i = 0; i < 10; i++) break;{ 28 System.out.print("你好!" + " "); 29 } 30 System.out.println("大家好!"); 31 // 再看看这方式;这个程序的执行顺序是什么样的 32 // 当执行 for 括号中的语句完后,本应该执行大括号中语句块,但在这之前先遇见了 break 语句,按照 break 的特性直接 33 // 跳过本循环的其余语句,执行后面的语句,奇妙的事情发生了,因为有了 break 语句造成了之前 for 循环留下的语句块, 34 // 使得该语句块的程序与 for 循环分隔成为独立的程序,所以 break 执行后 37 行的语句成为独立的语句单独顺序执行 35 // output result: 你好! 大家好! 36 } 37 }
2、在块中和标号配合使用,其语法格式是: break 标号;
1 public class Test15 { 2 public static void main(String[] args) { 3 4 int x = 20; 5 out:for( int i = 2; i < 10; i++){ // out: ---> 标记 6 System.out.println("begin i = " +" "+ i); 7 8 while(x < 1000){ 9 System.out.println("i = " + i +" " +", x = " + x); 10 if (x * i >= 80) { 11 break out; 12 /** break 与 break out 的区别: 13 * 先谈谈 break out 的用法: 首先有一个 out:的标记,该标记用于当出现 break out 语句执行时,跳到该标记的位置, 14 * 以这个位置为出发点,跳过这个出发点所包含的整个语句块,随后执行下一个语句块,从这个程序可以看出,out: 标记在了 15 * for 循环上,也就是说当程序执行到 break out 后直接跳过这个 for 循环本身,直接执行 for 循环以外的程序*/ 16 }else{ 17 x += 5; 18 } 19 } 20 } 21 System.out.println("after out look"); 22 } 23 } 24 25 /** 所以 break 与 break out 的区别就一目了然了:break 跳过本块余下语句,转到块尾,执行块后的语句,而 break out 是跳到所标记的位置,然后跳过 26 * out:所标记的整个循环语句块,执行其余的语句块, 27 * 28 * break out 自然就拥有了 break 所没有的选择性 29 * */
continue的用法:
1、是结束此次循环执行下一次循环;
2、在块中和标号配合使用,其语法格式是:continue 标号;
1 public class Test16 { 2 public static void main(String[] args) { 3 4 out: for(int i = 0; i < 10; i++){ 5 6 for (int j = 0; j < 20; j++) { 7 8 if (j > i){ 9 System.out.println(); 10 // break; // 当 if 判断正确输出 11 行 ,执行到此处时跳过本程序的剩余语句,也就是跳过从12行开始到23行的所有执行 11 // 程序,直接执行 24 行 System.out.print("* "); 12 // 为什么 for 中 嵌套 if 语句时 if 中的 break 语句是对 for 进行跳转? 13 // if 本身也是一个分支跳转语句,所以 if 与 break 连用时不考虑 break 是否只对 if 进行跳转 14 // 它们两个作为一个整体在 for 中 ,所以 break 结束的是 for 余下的循环执行程序 15 continue out; 16 } 17 // break; // 跳过 8 行 for 循环,直接执行 24 行 System.out.print("* "); 18 System.out.print("* "); 19 /** continue 的用法是结束当此循环执行下一次循环,当然 也可以与标号连用,语法上: continue out 其用法: 20 * 结束当次循环执行 out: 所标记的程序起点。 21 * */ 22 }// System.out.print("* "); 23 24 } 25 } 26 } 27 /** output result: 28 * * 29 * * * 30 * * * * 31 * * * * * 32 * * * * * * 33 * * * * * * * 34 * * * * * * * * 35 * * * * * * * * * 36 * * * * * * * * * * */