JavaSE基础知识(七)--Java程序流程控制之循环

Java SE 是什么,包括哪些内容(七)?

本文内容参考自Java8标准
本文将包括所有Java中有关程序流程控制的内容,如果有读者发现遗漏或者是错误,请及时给我留言,我将及时改正,谢谢!
程序流程控制可以简单用一句话来开始:如果是这种情况,就走A流程,如果是那种情况就是走B流程…所以,一个完整的程序中会有很多流程,因为,一个完整的程序需要包括很多种情况,并且程序后期的维护也是为了补充新出现但未涉及到的流程。
Java使用了C的所有流程控制语句,大多数过程型编程语言都具有某些形式的控制语句,他们通常在所有语言中是及其类似的,在Java中,涉及的关键字包括:if…elsewhiledo…whileforreturncontinuebreak,switch
Java并不支持goto语句(该语句引起很多的反对意见,但它仍是解决某些特殊问题最便利的方法,最后我会详细解释,为什么goto臭名昭著),但是在Java中,仍然可以进行像goto那样的跳转,但是比起典型的goto,有了很多的限制。
重要的事情说三遍:个人觉得非常有必要花一些时间去深入理解流程控制语句!因为,它绝对是你看懂别人代码的基础!
重要的事情说三遍:个人觉得非常有必要花一些时间去深入理解流程控制语句!因为,它绝对是你看懂别人代码的基础!
重要的事情说三遍:个人觉得非常有必要花一些时间去深入理解流程控制语句!因为,它绝对是你看懂别人代码的基础!

1、非常重要的两个关键字:true,false

除了switch语句,其他的条件语句都利用条件表达式的真假来决定执行路径,这里有一个条件表达式的例子:a==b;它用条件操作符"=="来判断a值是否等于b值,该表达式返回true或者false(如果a与b相等,就是true,如果不等,就是false)。
之前博文介绍的所有关系操作符,都可以拿来构造条件语句!
PS:Java不允许我们直接将一个数字作为布尔值来使用,但是这在C和C++中是允许的(在这些语言里,"真"是非零,"假"是零),如果想在一个布尔测试中使用非布尔值,需要将这个非布尔值转换为一个布尔表达式,例如:if(a!=0)

2、if…else

if…else语句是控制程序流程的最基本的形式,其中else是可选的(可以只有if,而没有else),所以,可按下述两种形式来使用if:
⑴、第一种形式

// if...
    if(boolean--expression)
      { 
          statement;
      }

⑵、第二种形式

// if...else
    if(boolean--expression)
      {
          statement;
      }else{
          statement;
      }

布尔表达式"boolean–expression"必须产生一个布尔结果,statement是指用分号结尾的简单语句,或封闭在**{ }**内的一组简单语句。
示例1:

// if...else举例
public class One {
    //方法LCKZ,带有一个int类型的参数i
	public void LCKZ(int i) {
	    //如果i的值为2,就在控制台打印"2"。
		if(i==2) {
			System.out.println("2");
		}
		//注意,这句代码只要调用了方法LCKZ(int i),就一定会执行!
		System.out.println("没有进入if语句!");
	}
	public static void main(String[] args) {
	    //创建类One的对象
		One o = new One();
		//调用方法LCKZ(int i)
		o.LCKZ(1);
		//结果:
		//仅在控制台输出了:没有进入if语句!
	}
}

示例1的实际操作结果!
示例2:

// if...else举例
public class One {
    //方法LCKZ,带有一个int类型的参数i
	public void LCKZ(int i) {
	    //如果i的值为2,就在控制台打印"2"。
		if(i==2) {
			System.out.println("2");
		}
		//注意,这句代码只要调用了方法LCKZ(int i),就一定会执行!
		System.out.println("没有进入if语句!");
	}
	public static void main(String[] args) {
	    //创建类One的对象
		One o = new One();
		//调用方法LCKZ(int i)
		o.LCKZ(2);
		//结果:
		//既输出了2,又输出了:没有进入if语句!
	}
}

示例2的实际操作结果!
现在,我们发现了一个问题,只要调用了方法LCKZ(int i),结果一定会出现"没有进入if语句",那么,如何控制一旦进入了if语句就不再输出它了呢?这个时候,就得用上else了。很明显,if和else代表了两个流程。
示例3:

// if...else举例
public class One {
    //方法LCKZ,带有一个int类型的参数i
	public void LCKZ(int i) {
	    //如果i的值为2,就在控制台打印"2"。
		if(i==2) {
			System.out.println("2");
		}
		//注意,增加了else,这句代码就是另外一个流程了。
		//只要没有进入if,就会执行else,如果执行了if,
		//else就不再被执行!
		else{
		    System.out.println("没有进入if语句!");
		}
	}
	public static void main(String[] args) {
	    //创建类One的对象
		One o = new One();
		//调用方法LCKZ(int i)
		o.LCKZ(2);
		//结果:
		//既输出了2,又输出了:没有进入if语句!
	}
}

示例3的实际操作结果1!
在熟悉了if…else的基本使用之后,还有两个问题需要明确。
①、多个if…else连接,也可以称为是if…else的终极版本,出现这种情况是因为你确实有这么多的条件需要判断!

// if...else的终极版本
if(boolean--expression)
      {
          statement;
      }else if(boolean--expression){
          statement;
      }else if(boolean--expression){
          statement;
      }else if(boolean--expression){
          statement;
      }else if(boolean--expression){
          statement;
          //这里还可以有无数的else if(boolean--expression)
          //鉴于篇幅,我就不再加了。
      }else{
          statement;
      }
      //有个问题需要特别注意,"else if"并不是新的关键字,只是在一个if...else
      //结束之后紧接这另一个if...else的开始。

②、如果确实需要,你可以这么做—在if…else里面,你还需要继续判断,这就是if…else的嵌套了,甚至嵌套一个终极版本也是可以的。

// if...else的终极版本
if(boolean--expression)
      {
          if(boolean--expression){
               statement;
          }else if(boolean--expression){
               statement;
          }else if(boolean--expression){
               statement;
          }else if(boolean--expression){
               statement;
          //这里还可以有无数的else if(boolean--expression)
          //鉴于篇幅,我就不再加了。
          }else{
               statement;
               }
      }else {
          if(boolean--expression){
               statement;
          }else{
               statement;
          }
      }
      //如果你觉得很复杂,那么请你将所有的{ }上下对齐,再仔细看看,就很有帮助,
      //至少你能看出主体的框架结构。
      //这里就不再举实际的例子了,有兴趣,自己可以试一试。

注意,虽然{ }里面的statement只有一句简单语句的时候,{ }可以省略,但是强烈不建议这么做,不管在什么情况下,都必须写上{ }!

3、迭代(循环)

有三种关于迭代的选择:whiledo…whilefor
whiledo…whilefor 用来控制循环,有时将它们划分为迭代语句
它们都有**{ },一旦用到了它们,那么{ }** 里面的所有内容都将不断地执行,直到它们的布尔表达式的结果为"假"(或者说不成立)。
⑴、while循环的表达式:

// while循环表达式
   while(boolean-expresion){
        statement;
   }

这里说三句话:如果理解了,那么while循环你们就掌握了90%,并且有利于去阅读其他人的代码:
①、while循环是一个整体,要么执行,要么不执行。
②、while循环的boolean-expresion结果成立(为真)开始执行。
③、while循环的boolean-expresion结果不成立(为假)停止执行。
如图:

Created with Raphaël 2.2.0 boolean-expression表达式成立! 执行{ }内的所有内容 继续判断boolean- exprssion 表达式是否成立? 退出while循环! yes no

每次while循环都是先判断,后执行循环,先判断,后执行循环,判断的次数总是比执行循环的次数多一次,因为最后一次判断不成立,循环不再执行。
代码示例:

// while循环代码示例
public class One {
    //测试方法Test()
	public void Test() {
	    //声明变量i;
		int i = 1;
		//while循环,如果i<6停止循环。
		while(i<6) {
		    //循环一次,输出i的值。
			System.out.println(i);
			//循环一次,i自增1。如果i不自增的话。
			//i永远是1,永远小于6。那么这个while循环就停不下来。
	        //如果一个循环停不下来,是比较麻烦的bug。
			i++;
		}
	}
	public static void main(String[] args) {
		One o = new One();
		o.Test();
	}
}
//你们可以猜一猜,最后的执行结果是什么?

实际代码示例:
实际结果是1,2,3,4,5!
⑵、do…while循环的表达式:

// do...while循环表达式
   do{
        statement;
   }while(boolean-expresion);

这里说三句话:如果理解了,那么do…while循环你们就掌握了90%,并且有利于去阅读其他人的代码:
①、do…while循环是一个整体,要么执行,要么不执行。
②、先执行循环体,也就是do后面的{ }里面的内容,再判断boolean-expression表达式是否成立。
③、do…while的执行次数总是和判断次数一样多,因为,每次总是先执行就立马进行判断,如果表达式为假,循环体不再执行。
如图:

Created with Raphaël 2.2.0 直接执行do的{ }里面的内容! 判断while 的boolean- expression 表达式 是否成立! 成立 退出当前的do...while循环! yes no

"成立"下面这条yes的箭头应该直接指向"直接执行do{ }里面的内容"的这个框,但是CSDN提供的这个图确实有BUG,我尝试了无数次都实现不了,结果只能放弃!
每次do…while循环都是先执行,后判断,先执行,后判断,判断的次数总是和执行循环的次数一样多(因为只要执行完后立马就进行判断)。
代码示例:

// while循环代码示例
public class One {
    //测试方法Test()
	public void Test() {
	    //声明变量i;
		int i = 1;
		//while循环,如果i<6停止循环。
		do {
		    //循环一次,输出i的值。
			System.out.println(i);
			//循环一次,i自增1。如果i不自增的话。
			//i永远是1,永远小于6。那么这个while循环就停不下来。
	        //如果一个循环停不下来,是比较麻烦的bug。
			i++;
		}while(i<6);
	}
	public static void main(String[] args) {
		One o = new One();
		o.Test();
	}
}
//你们可以猜一猜,最后的执行结果是什么?

实际结果是1,2,3,4,5!
结果和while循环是一致的。
在实际的编程中,while是使用非常频繁的,但是do…while几乎不怎么使用,你可以根据自己的实际需要进行选择!
最后再强调一遍:如果while循环的条件表达式结果为false,整个while循环根本不会执行,但是do…while循环至少会执行一次,因为它是先执行再判断!
最后,还有一种特殊的情况需要强调一下:

// while无限循环
   while(true){
        statement;
   }
//do...while无限循环
   do{
      statement;
   }while(true);

如果whiledo…while的条件表达式里面直接是一个"true",那么这将是一个无限循环,程序到这里将一直循环下去,连地球毁灭都阻止不了,这种情况慎用,使用它的最典型的应用就是聊天系统,利用一个无限循环时刻检测对方是否有连接过来,如果使用了无限循环,循环内部一定会有一个跳出循环的条件判断,一旦满足,立即终止循环,继续执行循环后的程序代码。

⑶、for循环的表达式:for循环常用于执行"计数"!
for循环有固定的格式,我们必须先了解它固定的格式,才能知道如何使用。

// for循环的固定格式
   //initialization代表了一个初始化值,Boolean-expression代表一个
   //循环终止条件判断,step是一个步进。
   for(initialization;Boolean-expression;step){
       statement;
   }

进入for循环,首先执行初始化表达式,然后再执行条件表达式,如果满足条件表达式,则进入循环,循环后,再进入步进。步进后,再次执行条件表达式,如果满足条件表达式,则继续循环,直到条件表达式的结果为false。
最重要的:每次循环之前会执行条件表达式,结果为true,进入循环,结果为false,退出循环,每次循环结束后,会执行步进表达式!
for循环典型的应用环境是:从一开始,你就知道需要循环多少次!
①、首先,你知道它从哪里开始。
②、其次,你知道它到哪里结束。
③、最后,你需要的循环间隔是多少。
以上三点的开始结束间隔都是指数值!数值!数值!
如果以上内容,你还是看不懂,那么,我再通过举例说明:
举例1:
有一个数组{0,1,2,,3,4,5,6,7,8,9},请取出数组中的每一个值,
并打印出来。
思路1: 开始是从第一个开始,结束是最后一个(也就是数组长度),间隔是1。所以for循环的代码:

// for循环的实际举例
//首先,从第一个开始,所以需要一个变量
//i,初始化为0(从0开始是因为数组的下标从0开始),其次,循环结束的条件是数组长度,
//也就是10,所以是i<10就直接退出。
//步进指的是,结束当前值,继续下一个值。
//如果没有步进,for循环也是一个无限循环,
//因为,如果没有步进,i值永远是0,i<10永远成立!
for(int i=0;i<10;i++){
    //首先执行i=0操作,再执行i<10,显然成立,立即进入循环体,所以你在
    //首次进入for循环的时候,直接打印i的值,结果为0,,说明未执行i++
    //步进表达式。
    //首次循环执行完毕后,立即进入步进表达式(i++),
    //接着再进入条件表达式,如果满足,立即进入循环。
    //直到条件表达式结果为false,立即退出for循环。
    //总结:初始化表达式只执行1次。之后一直在步进以及条件表达式中循环
    ...
}

for循环执行机制解释!

思路2: 开始是从最后一个开始(也就是数组长度),结束是第一个,间隔是1。所以for循环的代码:

// for循环的实际举例
//首先,从最后一个开始,所以需要一个变量
//i,初始化为10(数组的长度),其次,循环结束的条件是不能小于第一个,也就是0(数组下标)
//所以是i>0就直接退出。
//步进指的是,结束当前值,继续下一个值。
//如果没有步进,for循环也是一个无限循环,
//因为,如果没有步进,i值永远是10,i>0永远成立!
for(int i=10;i>0;i--){
    ...
}

以上两个例子,一个是按从头至尾循环,一个是逆向循环,for循环的固定格式的魅丽就在于你如何设置开始,如何设置条件表达式,如何设置步进
如果以上举例需要每一个奇数位值或者是偶数位值,那么步进就是2(也就是间隔是2)!
最后,还有两种特殊的情况需要强调一下:
①、for循环可以有多个初始化表达式多个步进表达式但是只能有一个条件表达式(如果是两个条件表达式,那么它们的性质是一样的,本质上还是一个!)
在for循环的初始化部分,实际上可以拥有任意数量的相同类型的变量定义!定义多个变量的这种能力仅限于for循环使用。其他任何循环中都不能这样使用!

// for循环及其复杂的情况
for(int i=0;j=i+10;i<5;i++,j=i*2){
     statement;
}

②、for循环的初始表达式、条件表达式、步进表达式都可以为空:

// 最精简的for循环
      //初始表达式、条件表达式、步进表达式都可空,但是";"是不能省略的!
       for(;;){
           //如果是这种形式,那么这个for循环就是一个无限循环。
       }

⑷、foreach循环
这里暂时不适合讲解foreach循环,因为它不是一种通用的循环方式,它仅仅是Java SE5版本针对数组和容器而特别増加的便捷功能!后面提到数组和容器的时候会描述foreach循环的使用场景及方式。

第一部分的程序流程控制就是以上内容,下一遍博文将重点描述有关流程控制的三个关键字的使用:retuen,break,continue
PS:时间有限,有关Java SE的内容会持续更新!今天就先写这么多,如果有疑问或者有兴趣,可以加QQ:2649160693,并注明CSDN,我会就博文中有疑义的问题做出解答。同时希望博文中不正确的地方各位加以指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值