Java面向对象基础
第三章 选择结构
无论是Java还是任何一门语言,都由流程控制语句组成,使用流程控制语句能够实现相应的业务流程和算法实现。
流程控制分为三种:
- 顺序结构
- 选择结构(分支结构)
- 循环结构
一、什么是选择结构:
所谓的选择结构,就是代码会根据实际情况,做出相应的选择。
二、if分支结构
1、基本单分支if语句:
if(boolean类型的表达式){
//当boolean类型的表达式为ture 时,所致行的代码块;
}
(1)如果boolean类型的表达式为false,则整个if单分支结构运行完毕(即不执行if语句),继续执行后面的代码。
(2)如果boolean类型的表达式为true,执行if单分支的代码,执行完毕后 ,继续执行if单分支之外的后面代码。
补充:
- 代码块:就是由一对{}所包围起来的代码。
- 表达式就是一个值。
2、使用复杂条件的if选择结构
public static void main(String[] args) {
/*
* 张浩Java成绩大于90分,并且音乐成绩大于80分时,
* 或者Java成绩等于100分,音乐成绩大于70分
*
* 分析:
* 条件有两大部分组成:
* (Java成绩 > 90分 && 音乐成绩 > 80分)
* ||
* (Java成绩 == 100分 && 音乐成绩 > 70分)
*/
// 初始化 int 类型的变量 javaScore 存储 Java 考试成绩
int javaScore = 98;
// 初始化 int 类型的变量 musicScore 存储音乐考试成绩
int musicScore = 90;
/*
* 初始化 boolean 类型变量 flag 存储:
* (Java成绩 > 90分 && 音乐成绩 > 80分)
* ||
* (Java成绩 == 100分 && 音乐成绩 > 70分)
*/
// 得到最终的判断之后,可以使用 if 单分支结构进行判断
if ((javaScore > 90 && musicScore > 80) || (javaScore == 100 && musicScore > 70)) {
// 当 boolean 类型表达式为 true 时,所执行的代码
System.out.println("考的不错,奖励给你十双鸿星尔克!");
}
}
使用逻辑运算符实现复杂条件。
3、 结合运算符的优先级编写条件
(1)最高的优先级()
(2)最低的优先级 =
(3)优先级:! > 算术运算符 > 关系运算符 > && > ||
(4)复杂条件使用括号可以提高可读性
三、流程图
流程图是逐步解决指定问题的步骤和方法的一种图形化表示方法。
1、什么是流程控制
流程控制是用来控制程序中各语句的执行顺序。
2、流程控制图工具
visio
四、if-else选择结构
如果使用多个单分支结构,必须严格控制boolean类型表达式的区间,那么将产生无法判断的情况。因此,产生if-else双分支结构。
语法结构:
if(boolean类型表达式){
//boolean类型表达式为true
}else{
//boolean类型表达式为false
}
五、多重分支if-else if-else
当需要实现多分支结构时,使用if-else语句会产生需要大量嵌套的if-else语句,时代吗的复杂度大幅上升。因此产生if-else if-else多重分支语句。
语法结构:
if(boolean类型表达式1){
//boolean类型表达式1为true
}else if(boolean类型表达式2){
//boolean类型表达式1为false,表达式2为true
}
...
else{
//当所有表达式都为false
}
补充:
(1)如果变量是String类型,在判断相等时,使用equals()方法实现;只有基本数据类型的值,在判断相等时,使用“==”实现。
(2)所有位于java.lang包下面的引用类型,都不需要使用import关键字引入。
六、switch选择结构
1、语法结构
switch(int类型表达式){
case int类型值1:
//当int类型表达式的值等于此时int类型值1时
break;
case int类型值2:
//当int类型表达式的值等于此时int类型值2时
break;
...
default:
//与int类型值均不相等时
break;
}
2、结构特征
(1)专门用于解决分支结构中的等值判断这一特殊情况。因此当判断条件为非等值判断时,是无法使用switch…case结构的。
(2)switch…case能够解决问题,if…else if …一定也能解决;用if …else if …能解决的问题不一定能使用switch…case解决。switch…case是if…else if…的特殊情况。
(3)switch…case中,所有的case都在一个代码块中,而if…else if…则分布在不同的代码块中。
(4)当分支条件过多时,switch…case的执行效率要比if…else if …高。(类似于switch…case的结构相当于空间换时间)
3、代码展示
import java.util.Scanner;
/*
* 通过控制台控制输入两个整数
* 实现五个功能个:+、-、*、/、%
*/
public class Homework001 {
public static void main(String[] args) {
Scanner input = new Scanner (System.in);
System.out.println("****************简易计算器**************");
System.out.println("1.计算加法\t\t2.计算减法\t\t3.计算乘法\t\t4.计算除法\t\t5.计算余数");
System.out.println("*************************************");
System.out.println("请输入功能编码: ");
int order = input.nextInt(); //编码号
int num1 =0;
int num2= 0;
//判断是否编码小于6
if(order>=1&&order<=5){
System.out.println("请输入所要计算的第1位数字:");
num1 = input.nextInt(); //数字1
System.out.println("请输入所要计算的第2位数字:");
num2 = input.nextInt(); //数字2
}
switch (order) {
case 1:
//加法运算
System.out.println("进入计算加法功能--------");
int result1 = num1 + num2;
System.out.println("运算式为:"+num1+"+"+num2+"="+result1);
break;
case 2:
//减法运算
System.out.println("进入计算减法功能--------");
int result2 = num1 - num2;
System.out.println("运算式为:"+num1+"-"+num2+"="+result2);
break;
case 3:
//乘法运算
System.out.println("进入计算乘法功能--------");
int result3 = num1 * num2;
System.out.println("运算式为:"+num1+"*"+num2+"="+result3);
break;
case 4:
//除法运算
System.out.println("进入计算除法功能--------");
double result4 = num1 / num2;
System.out.println("运算式为:"+num1+"/"+num2+"="+result4);
break;
case 5:
//取余运算
System.out.println("进入计算取余功能--------");
int result5 = num1 % num2;
System.out.println("运算式为:"+num1+"%"+num2+"="+result5);
break;
default:
System.out.println("输入错误!");
break;
}
}
4、 分析
(1)switch所需要的是一个int类型的表达式,只要这个数据类型,能够自动类型转换为int类型,都可以使用,包括char类型。(从JDK8开始,也可以是String类型)
(2)break关键字在switch…case中能终止代码的运行,跳出所在代码块,继续执行后面代码。表现为:能够终止继续向下继续运行其他的case代码,防止代码的穿击现象。
(3)switch…case在执行时,首先会根据switch的int类型表达式进行匹配哪个case的值相同,在运行完毕这个case代码之后,会继续向下运行其他case的代码,直至所有的case和default的代码都执行完毕或者是遇到break关键字,才能停止运行,整个结构运行结束。
(4)无论default放在任何位置,在执行时,都会首先按照顺序判断所有的case,然后才会执行default。如果default在代码中间位置,且无break,那么代码会先执行default,然后执行其下面的case,直到所有的代码运行完毕,或者是遇到break.