第三章 控制语句
流程控制语句是用来控制程序中各种语句执行顺序的语句
可以把语句组合成能完成一定功能的小逻辑模块,
程序的结构可分为三类:顺序,选择,循环
顺序结构代表:"先执行a,再执行b"的逻辑。
条件判断结构代表:"如果...则..."的逻辑。
循环结构代表:"如果...则再继续..."的逻辑。
3.1 条件判断结构
条件判断结构用于判断给定的条件,然后根据条件判断的结果来控制程序的流程。
主要的条件判断结构有if结构,switch结构,
if结构又可以分为if单分支结构,if-else双分支结构,if-else if-else 多分枝结构。
3.1.1 if单分支结构
if单分支结构语法
if(布尔表达式){
语句块;
}
if语句对布尔表达式的值进行一次判断,若判断其值为真,则执行{}中的语句块,否则跳过该语句块。
math.random()方法用于产生[0,1]之间的随机数,但是不包括1.
//产生0~5之间的随机整数
int i= (int)(6*math.random()) ;
如果if语句不写{},则只能作用于后面的第一条语句。
建议任何时候都写上。
3.1.2 if-else双分支结构
if-else 的语法结构如下:
if(布尔表达式){
语句块1
} else{
语句块 2
}
当布尔表达式的值为真时,执行语句块一,否则执行语句块2也就是else部分。
if-else 与条件运算符有时候可以互换
if(a<b){
syetem.out.println(a);
}else{
System.out.println(b);
}
System.out.println((a<b)?a:b);
3.1.3 if-else if-else 多分支结构
if(布尔表达式1){
语句块1;
} else if(布尔表达式2){
语句块2;
} ...
else if (布尔表达式n){
语句块n;
} else{
语句块n+1;
}
对应表达式为真,执行对应语句块
3.1.4 switch 多分分支结构
switch语句的语法结构
switch(表达式){
case值1:
语句序列1;
[break];
case值2:
语句序列2;
[break];
...
default:
默认语句;
}
switch语句会根据表达式的值,从相匹配的case标签处开始执行。
一直执行到break语句处,或则是switch语句的末尾。
如果表达式的值与每个case值都不匹配,则进入default语句。
当布尔表达式是等值判断的情况,,可以使用 if-else if-else
多分支结构,或则switch结构。
如果布尔表达式是区间判断的情况,则只能使用if-else if-else
3.2 循环结构
循环结构分为两大类,一类是当型,另一类是直到型。
当型:当布尔表达式的值为true时,反复执行某语句,
当布尔表达式的值为false时才停止循环,eg:while与for循环。
直到型:先执行某语句,再判断布尔表达式,布尔表达式的值如果是true,再执行某语句。
如此反复,直到布尔表达式的值为false时才停止循环,列入do-while循环。
3.2.1 while循环
1,语法结构:
while(布尔表达式){
循环体;
}
在循环刚开始时会计算一次布尔表达式的值,若值为真则执行循环体;
而对于后来每一次额外的循环,都会在开始前重新计算一次。
3.2.2 do-while循环
1,语法结构
do{
循环体;
}while(布尔表达式) ;
do-while循环结构会先执行循环体,然后再判断布尔表达式的值,
若值为真,则执行循环体,当值为假时结束循环。
do-while循环的循环体至少执行一次。
3.2.3 for循环
1,语法结构
for(初始表达式;布尔表达式;迭代因子){
循环体;
}
true--->执行循环体--->迭代
初始化---> 布尔表达式---> 退出
false-------------->
初始化部分设置循环变量的初始值,
条件判断部分为布尔表达式,
迭代因子控制循环循环变量的增减。
3.2.4 嵌套循环
1,在一个循环语据中在嵌套一个或多个循环,
3.2.5 break语句和continue语句
1,break语句可用于任何循环语句的主体部分,
用于强行退出循环,不执行循环中剩余的部分。
2,continue语句用在循环语句体中,用来终止某次循环过程,
即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
continue语句同在while,do-while循环中时,continue语句立刻跳到循环首部,越过了当前循环的其余部分。
continue语句用在佛如循环中时,跳到for循环的迭代因子部分。
3.2.6 带标签的break语句和continue语句
实际中没见过。
3.3 语句块
1,用{}括起来的任意简单语句,语句块确定了局部变量的作用域 ,语句块中的程序代码看作一个整体,
语句块可以嵌套在另一语句块中,但是不能在两个嵌套的语句块内声明同名变量。
语句块可以使用外部的变量,外部不能使用语句块中定义的变量。
语句块中的作用域只限于语句块。
3.4 方法
1,方法就是一段用来玩完成特定功能的代码片段,类似于其他语言的函数,
方法用于定义该类,或该类的实例变量的行为特征和功能的实现。
2,方法声明格式
修饰符1 修饰符2... 返回值类型 方法名(形式参数列表){
java语句;
}
3.方法的调用方式
对象名.方法名(实参列表)
方法的详细说明;
.形式参数:在方法声明时用于接收外界传入的数据,简称形参。
.实参:调用方法时,实际传给方法的数据
.返回值:方法在执行完毕后,返还给调用它的环境的数据 。
.返回值类型:事先约定的返回值的类型,如果没有返回值,则必须显示指定为void。
注意事项:
实参的数目,数据类型,和次序必须和所调用的方法声明的形式参数列表匹配。
return语句终止方法的运行,并指定要返回的数据。
Java在方法调用中传递参数时,遵循值传递的原则(传递的都是数据的副本)。
基本类型传递的是该数据值的copy值。
引用类型传递的是该对象引用的copy值,但指向的是同一对象。
3.5 方法的重载(overload)
1,方法重载指的是一个类中可以定义多个方法名相同,但是参数不同的方法。
调用时会根据不同的参数,自动匹配对应的方法。
方法的重载实际上是完全不同的方法,只是名称相同而已。
2,构成方法重载的条件如下;
不同的含义:形参类型,形参个数,形参顺序不同。
只有返回值不同不构成方法的重载。
只有形参的名称不同,不构成方法的重载。
3.6 递归结构
1,递归的基本思想是自己调用自己。
斐波那契数列,汉诺塔,快排,使用递归方便解决
递归结构包含:
定义递归头:解答什么时候不调用自身方法。
递归体积:解决什么时候需要调用自身方法。
递归会占用大量系统堆栈,内存消耗多,
在递归调用层次多时速度要比循环慢得多。
任何能用递归解决的问题,也能使用迭代解决。