一、顺序结构
任何编程语言中最常见的结构就是顺序结构。顺序结构就是程序从上到下遂行的执行,中间没有任何的判断和跳转。
如果main方法的多行代码之间没有任何流程控制。则程序总是从上向下依次执行,排在前面的代码先执行,排在后面的代码后执行。这意味着:如果没有流程控制,Java方法里的语句是一个顺序执行流。从上向下一次执行每条语句。
二、分支结构Java提供了两种分支结构:if语句和switch语句,其中if语句使用布尔表达式或布尔值作为分支条件进行分支控制而switch语句则用于对多个整数值进行匹配,从而实现分支控制。
if条件语句有如下三种形式:
第一种:
if(logic expression)
{
statement。。。。。
}
第二种:
if(logic expression)
{
statement。。。。。
}
else
{
statement。。。。。
}
第三种:
if(logic expression)
{
statement。。。。。
}
else if(logic expression)
{
statement。。。。。
}
else//最后的else语句也可以省略
{
statement。。。。。
}
注意:if else ,else if 后的条件执行体要么是花括号扩起来的一个代码块,则整个代码块整体作为条件执行体;要么是以分号结束的一行语句,那么就就是这条语句作为条件执行体。如果if后有多条语句作为条件执行体,若省略了整个条件执行体的花括号,则会引起编译错误或者执行语句执行不到。
对于if语句还有一个很容易出现的逻辑错误:
package javase_day01;
public class 流程控制语句 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int age = 60;
if(age>20){
System.out.println("青年人");
}
else if (age>30) {
System.out.println("中年人");
}
else if (age>50) {
System.out.println("老年人");
}
else {
System.out.println("不是人");
}
}
}
表面上看起来上卖弄程序没有任何问题:人的年龄大于20是青年人大于30是中年人,年龄大于50是老年人等。但运行上面程序,发现打印结果是:青年人
而实际上我们希望判断出来的60岁时老年人,这显然出现了一个问题。
对于任何ifelse语句表面上看起来else后没有任何条件,或者elseif后面只有一个条件但是这不是真相:因为else的含义是否则——else本身就是一个条件:else隐含的条件就是对前面条件取反。因此上面代码实际可改写为
package javase_day01;
public class 流程控制语句 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int age = 60;
if(age>20){
System.out.println("青年人");
}
else if (age>30 && !(age>20)) {
System.out.println("中年人");
}//在原本的条件中增加了else的隐含条件。
else if (age>50 && !(age>20) && !(age>30 && !(age>20))) {
System.out.println("老年人");
}
else {
System.out.println("不是人");
}
}
}
如果每次都去计算if条件和else条件的交际也是一件非常繁琐的事情,为了避免上面出现的错误,在使用if else语句时有一条基本规则:总是把优先 把范围小的条件放在前面处理。如age>50何age>30这两个条件,明显age>50范围更小,所以应该先处理age>50的情况!
switch分支语句:和if语句不同的是switch语句后面控制的表达式类型只能是byte short char int string和枚举。
switch语句的代码格式如下:
package javase_day01;
public class switch语句 {
public static void main(String[] args) {
// TODO Auto-generated method stub
switch(表达式值)
{
case 值1:
statement;
break;
case 值2:
statement;
break;
case 值3:
statement;
break;
default :
statement;
}
}
}
和if语句不同的是,switch语句中各case标签后代码块的开始点和结束点非常清晰,因此完全可以省略case代码块后的花括号。
与if语句中的else类似,switch语句中的default标签看似没有条件,其实是有条件的,条件就是表达式值不能与前面任何一个标签值相等。
还有一点需要注意的是如果省略了switch后的break语句,在满足条件向下执行的时候会一直向下执行直到遇到大括号或者break为止。
总之:if和switch语句都能实现多分枝结构,但switch只能处理等值条件的判断,且条件是整形变量或者字符型变量的等值判断,一般适应于多余5个以上的情况。
而if特别适合某个变量在某个区间时的情况。
循环结构:
while循环语句的语法格式如下:
package javase_day01;
public class while循环语句 {
public static void main(String[] args) {
// TODO Auto-generated method stub
while(布尔型的值或者表达式)
{
statement;
}
}
}
while循环语句在每次执行循环体之前先对循环体条件求值,如果为true则运行循环体部分。
注意几点:1,在使用循环体时,一定要保证循环条件有变成false的时候,否则整个循环将会成为死循环。
2,尽量不要省略后面的花括号,这样会造成程序的可读性降低,并可能引发错误
3,除此之外while循环体后紧跟一个分号。比如有下面一段程序
package javase_day01;
public class while循环语句 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int count = 0;
while(count <10);
{
System.out.println("不停执行死循环"+count);
count--;
}
}
}
这段程序会导致后面的循环体执行不到就结束,并且还是一个死循环,看不到结果!分号后面的代码块与循坏体没有任何关系,在分号哪里结束!
do while 循坏:与while循环不同的是while循坏先判断循环条件,在执行循环体,而dowhile则先执行一次循环体在回来判断循环条件,也就是说无论循环条件真假,循环体都会执行一次。代码格式如下
package javase_day01;
public class while循环语句 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int count = 0;
do
{
System.out.println("不同执行死循环"+count);
count--;
}while(count <10);
}
}
与while循环不同的是dowhile循环条件后必须有一个分号,整个分号表示循环结束!