第一章 流程控制
1_1_9_01_ 流程控制概述
在一个程序执行的过程中,各条语句的执行顺序对程序的结果是有直接影响的。也就是说,程序的流程对运行结果有直接的影响。所以,我们必须清楚每条语句的执行流程。而且,很多时候我们要通过控制语句的执行顺序来实现我们要完成的功能。
流程有三种:顺序结构,选择结构,循环结构
1_1_9_01_ 顺序结构
// 顺序结构
public class Demo01Sequence {
public static void main(String[] args) {
System.out.println("今天天气不错");
System.out.println("挺风和日丽的");
System.out.println("我们下午没课");
System.out.println("这的确挺爽的");
}
}
1_1_9_ 判断结构
1_1_9_02_ 判断语句1–if
-
if 语句第一种格式: if
if(关系表达式){ 语句体; }
-
执行流程
- 首先判断关系表达式看其结果是 true还是false
- 如果是 true就执行语句体
- 如果是 false就不执行语句体
单if语句的逻辑 是 :执行语句体,或者不执行他
// 单if语句
public class Demo02If {
public static void main(String[] args) {
System.out.println("今天天气不错,正在压马路……突然发现一个快乐的地方:网吧");
int age = 19;
//or int age = 16;那就只打印两句话
if (age >= 18) {
System.out.println("进入网吧,开始high!");
System.out.println("遇到了一群猪队友,开始骂街。");
System.out.println("感觉不爽,结账走人。");
}
System.out.println("回家吃饭");
}
}
1_1_9_03_ 判断语句2–if…else
- if 语句第二种格式: if…else
if(关系表达式) {
语句体1;
}else {
语句体2;
}
- 执行流程
- 首先判断关系表达式看其结果是 true还是false
- 如果是 true就执行语句体1;
如果是 false就执行语句体2。
加图
if…else 的逻辑是二者选其一
// 标准的if-else语句
public class Demo03IfElse {
// 判断给定的数据是奇数还是偶数
public static void main(String[] args) {
int num = 666;
//奇偶性是看余数决定的,余数得用%看 ,➗(/)只能看商
if (num % 2 == 0) {
// 如果除以2能够余数为0,说明是偶数
System.out.println("偶数");
} else {
System.out.println("奇数");
}
System.out.println("结束");
}
}
1_1_9_04_ 拓展的判断语句3–if…else if…else
- if 语句第三种格式: if…else if …else
if (判断条件1) {
执行语句1;
} else if (判断条件2) {
执行语句2;
}
...
}else if (判断条件n) {
执行语句n;
} else {
执行语句n+1;
}
- 执行流程
加图
首先判断关系表达式 1看其结果是true还是false
如果是 true就执行语句体1
如果是 false就继续判断关系表达式2看其结果是true还是false
如果是 true就执行语句体2
如果是 false就继续判断关系表达式…看其结果是true还是false
…
如果没有任何关系表达式为 true,就执行语句体n+1。
if…else if…else的逻辑是N者选其一
public static void main(String[] args) {
// x和y的关系满足如下:
// x>=3 :y = 2x + 1;
// ‐1 <= x < 3 :y = 2x;
// x<= ‐1 :y = 2x – 1;
// 根据给定的x的值,计算出y的值并输出。
// 定义变量
int x = 2;//结果y的值是4
//int x = 5;//结果y的值是11
//int x = -10;//结果y的值是-21
int y;
if (x>= 3) {
y = 2 * x + 1;
} else if (x >= ‐1 && x < 3) {
//else if(-1<x<3)错误
y = 2 * x;
} else {
y = 2 * x ‐ 1;
}
System.out.println("结果y的值是"+y);
}
1_1_9_05_ 判断语句练习
public static void main(String[] args) {
int score = 100;
if(score<0 || score>100){
System.out.println("你的成绩是错误的");
}else if(score>=90 && score<=100){
System.out.println("你的成绩属于优秀");
}else if(score>=80 && score<90){
System.out.println("你的成绩属于好");
}else if(score>=70 && score<80){
System.out.println("你的成绩属于良");
}else if(score>=60 && score<70){
System.out.println("你的成绩属于及格");
}else {
System.out.println("你的成绩属于不及格");
}
}
1_1_9_07_ 选择结构
switch(表达式的值) {
case 常量值1:
语句体1;
break;
case 常量值2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
- 首先计算出表达式的值
- 其次,和 case依次比较,一旦有对应的值,就会执行相应的语句,在执行的过程中,遇到break就会结束。
- 最后,如果所有的case都和表达式的值不匹配,就会执行default语句体部分,然后程序结束掉。
🐖注:case break 可以多次出现。
🐖注:如果没有相匹配的 case 标签 , 而有default 子句, 就执行这个子句
🈲Switch警告
1.直通的情况
2.多个case后面的数值(标签值)不可以重复
3.switch后面小括号当中只能是下列数据类型:
基本数据类型:byte/short/char/int
引用数据类型:String字符串(JDK1.7后支持)、enum枚举
🈴Switch+枚举常量
当在 switch 语句中使用枚举常量时, 不必在每个标签中指明枚举名 ,可以由 switch 的表达式值确定。
例如 :
Size sz = . . . ;
switch ( sz )
{
case SMALL : // no need to use Size . SMALL
break ;
🌈switch语句格式可以很灵活:前后顺序可以颠倒,而且break语句还可以省略。
🈚墙裂建议default+break
default:
System.out.println("数据不合理");
break;//最后一个break语句可以省略,但是强烈推荐不要省略。因为保持格式一致。
🥩Switch的穿透
“匹配哪一个case就从哪一个位置向下执行,直到遇到了break或者整体结束为止。”
所以推荐default+break,因为一旦不带break的dafault移动到上面了,就会通过default向下穿透
1_1_9_08_ 循环结构小节
摘自Java核心卷 第3章Java 的基本程序设计结构 79
3.10.1 for each 循环
Java 有一种功能很强的循环结构 , 可以用来依次处理数组中的每个元素 ( 其他类型的元素集合亦可 ) 而不必为指定下标值而分心 。
这种增强的 for 循环的语句格式为 :
for ( variable : collection ) statement
定义一个变量用于暂存集合中的每一个元素 ,并执行相应的语句( 当然也可以是语句块 ) 。collection 这一集合表达式必须是一个数组或者是一个实现了 Iterable 接口的类对象 ( 例如ArrayList ) 。 有关数组列表的内容将在第 5 章中讨论 , 有关 Iterable 接口的内容将在第 9 章中讨论。
例如,
for ( int element : a )
System.out.println(element);
打印数组 a 的每一个元素 , 一个元素占一行。
这个循环应该读作 “ 循环 a 中的每一个元素 ” ( for each element in a ) 。 Java 语言的设计者认为应该使用诸如 foreach 、 in 这样的关键字, 但这种循环语句并不是最初就包含在 Java 语言中的, 而是后来添加进去的 , 并且没有人打算废除已经包含同名 ( 例如 System.in) 方法或变量的旧代码。
当然, 使用传统的 for 循环也可以获得同样的效果 :
for ( int i = 0 ; i < a . length ; i + + )
System . out . println ( a [ i ] ) ;
但是, for each 循环语句显得更加简洁 、 更不易出错 ( 不必为下标的起始值和终止值而操心 ) 。
🥘注释 : foreach 循环语句的循环变量将会遍历数组中的每个元素 , 而不需要使用下标值 。
如果需要处理一个集合中的所有元素 , for each 循环语句对传统循环语句所进行的改进更是叫人称赞不已。 然而,在很多场合下,还是需要使用传统的for 循环,例如,如果不希望遍历集合中的每个元素,或者在循环内部需要使用下标值等。
🔊提示 : 有个更加简单的方式打印数组中的所有值,即利用 Arrays 类的toString 方法。调用 Arrays.toString ( a ) , 返回一个包含数组元素的字符串 , 这些元素被放置在括号内,并用逗号分隔 , 例如 ,“[ 2 , 3 , 5 , 7,11,13 ] ” 、 要想打印数组, 可以调用System . out . println ( Arrays . toString ( a ) );