Java学习笔记---控制执行流程

 Java使用了C的所有流程控制语句,涉及关键字有:if-else,while,do-while,for,return,break以及switch。Java不支持goto语句(该语句引起许多反对意见,但它仍然是解决某些特殊问题的最便利的方法),在Java中仍然可以进行类似goto那样的跳转,但比起典型的goto,有了很多限制。

  • true和false
  • if-else
  • 迭代
  • Foreach
  • return
  • break和continue
  • goto
  • switch

1.true和false

所有条件语句都利用条件表达式的真或假来决定执行路径。例:a==b,用条件操作符“==”来判断a值是否等于b值,该表达式返回true或false。

前面所有的关系操作符都可以用来构造条件语句。

需要注意:Java中不允许将一个数字作为布尔值使用。

如果想在布尔测试中使用一个非布尔值,比如if(a),那么首先需要用一个条件表达式将其转换成布尔值,例如if(a!=0) 

2.if-else

if-else是控制程序流程的最基本的方式。其中else可选,形式如下:

if(Boolean-expression)

  statement

if(Boolean-expression)

  statement

else

  statement  

布尔表达式必须产生一个布尔结果,statement指用分号结尾的简单语句,或复合语句---封闭在花括号内的一组简单语句

3.迭代

while,do-while和for用来控制循环。语句会重复执行,直到起控制作用的布尔表达式得到“假”的结果为止,while循环的格式如下:

 

例子:

condition方法用到了Math库里的static(静态)方法random(),该方法的作用是产生0和1之间(包括0,但不包括1)的一个double值。相比前面产生随机数的函数:Random rand = new Random(47);int i = rand.nextInt(100);产生0-100之间的一个整数。

while的条件表达式的意思是说:只要condition()返回true,就重复执行循环体中的语句。

do-while:

格式:

 

while和do-while唯一的区别就是do-while中的语句至少会执行一次,即便表达式第一次就被计算为false。而在while循环结构中,如果条件第一次就为false,那么其中的语句根本不会执行。

for:

for循环第一次执行之前需要进行初始化。随后,会进行条件测试,而且每次迭代结束时,进行某种形式的“步进”。for循环的格式如下:

 

初始化表达式,布尔表达式,或者步进运算都可以为空。每次迭代前会测试布尔表达式。若结果为true,就会执行for语句后面的代码行。每次循环结束会执行一次步进。

例子:

程序使用了java.lang.Character包装器类,这个类不但能把char基本类型的值包装进对象,还提供了一些其他的方法,这里用到了static idLowerCase()方法来检查问题中的字符是否为小写字母。 

逗号操作符:

Java里唯一用到逗号操作符的地方就是for循环的控制表达式。在控制表达式的初始化和步进控制部分,可以使用一系列由逗号分隔的语句,而且这些语句会独立执行。

需要注意:逗号操作符不是逗号分隔符,分隔符是用来分隔函数的不同参数

使用逗号操作符,可以在for语句内定义多个变量,但是它们必须具有相同的类型

例如:

4.Foreach

Foreach是一种更加简洁的for语法用于数组和容器。不必创建int变量去对由访问项构成的序列进行计数,foreach将自动生成每一项。

例如:有一个float数组,我们要选取该数组中的每一个元素。

这个数组使用旧式的for循环组装,因为在组装时必须按索引访问它。

 

这条语句定义了一个float类型的变量x,继而将每一个f的元素赋值给x。

任何返回一个数组的方法都可以使用foreach。例如:String类有一个方法toCharArray(),它返回一个数组,因此可以很容易地像下面这样迭代在字符串里面的所有字符:

 

foreach还可以用于任何Iterable对象

对于for语句在一个整形值序列中步进,如: 

对于这些语句,foreach语法不起作用,但可以使用net.mindview.util.Range包中创建的一个名为range()的方法,该方法会自动生成恰当的数组。

 

range()方法已经被重载,重载表示相同的方法名可以具有不同的参数列表。

range()的第一种重载形式是从0开始产生值,直至范围的上限;

range()第二种形式的重载是从第一个值开始产生值,直至比第二个值小1的值为止;

第三种形式有一个步进值,因此它每次的增量为该值。 

5.return

在Java中有多个关键词表示无条件分支,它们只是表示这个分支无需任何测试即可发生。这些关键词包括:return,break,continue和一种其他语言中的goto类似的跳转到标号语句的方式。

return关键词的用途:

1).指定一个方法返回什么值(假设它没有void返回值);

2).导致当前方法退出,并返回那个值。

例如:

不必加上else,因为方法在执行了return后不再继续执行。

如果在返回void的方法中没有return语句,那么在该方法的结尾处会有一个隐式的return,因此在方法中总是必须要有一个return语句。但是,如果方法声明它将返回void方法之外的其他东西,那么必须确保每一条代码路径都将返回一个值。

6.break和continue

在任何迭代语句的主体部分,都可用break和continue控制循环的流程。其中,break用于强行退出循环,不执行循环中剩余的语句。而continue则停止执行当前的迭代,然后退回循环起始处,开始下一次迭代。

 

在这个for循环中,i的值永远不会达到100;因为一旦达到74,break语句就会中断循环。只要i不能被9整除,continue语句就会使执行过程返回到循环的最开头(i会增加)。如果能整除,则将值显示出来;

第二种for循环展示了foreach用法,它将产生相同的结果;

最后一个“无穷while循环”,循环内部有一个break语句,可终止循环。continue语句执行序列移回到循环的开头,而没有去完成continue语句之后的所有内容。(只有i值能被10整除时才打印出值);

无穷循环的第二种形式是for(;;)。编译器将while(true)和for(;;)看作同一回事。

7.goto

goto语句起源于汇编语言的程序控制:“若条件A成立,则跳到这里;否则跳到哪里”

goto语句是在源码级别上的跳跃,这使其招致了不好的声誉;但是少数情况下,goto还是组织控制流程的最佳手段。

尽管goto仍是Java中的一个保留字,但在语言中并未使用它;Java没有goto。然而Java也能完成一些类似跳转的操作,这与break和continue这两个关键字有关。它们其实不是跳转,而是中断迭代语句的一种方法。

之所以把break,continue与goto一起讨论,是因为他们使用了相同的机制:标签

标签是后面跟有冒号的标识符:

label1:

在Java中,标签起作用的唯一的地方刚好是在迭代语句之前。“刚好之前”意思表明,在标签和迭代之间置入任何语句都不好。而在迭代之前设置标签的唯一理由:我们希望在其中嵌套另一个迭代或者一个开关。这是由于break和continue关键词通常只中断当前循环,但若随同标签一起使用,它们就会中断循环,直到标签所在的地方:

 

在(1)中,break中断内部迭代,回到外部迭代;

在(2)中,continue是执行点回到内部迭代的起始处;

在(3)中,continue label1也会中断内部迭代以及外部迭代,直接转到label1处;随后,它实际上是继续迭代过程,但从外部迭代开始;

在(4)中,break label1也会中断所有迭代,并回到label1处,但并不重新进入迭代。也就是说,它实际上完全终止了两个迭代。

下面例子反映了上面这四种情况:

注意:break会中断for循环,而且抵达for循环的末尾之前,递增表达式不会执行。由于break跳过了递增表达式,所以i==3的情况下直接对i执行递增运算。i==7的情况下,continue outer语句会跳到循环顶部,而且也会跳过递增,所以这里也对i直接递增。

如果没有break outer语句,就没办法从内部循环里跳出外部循环。这是由于break本身只能中断最内层的循环(continue也是如此)。

如果向在中断循环的同时退出,简单的用一个return即可。

下面例子展示了带标签的break以及continue语句在while循环中的用法:

 结果为:

 

同样的规则亦适用于while:

1).一般的continue会退回最内层循环的开头(顶部),并继续执行;

2).带标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环;

3).一般的break会中断并跳出当前循环;

4).带标签的break会中断并退出标签所指的循环。

 重点:在Java里需要使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中break或continue。 

8.switch

switch有时被划归为一种选择语句,根据整数表达式的值,switch语句可以从一系列代码中选出一段去执行。格式如下:

 

其中,Integral-selector(整数选择因子)是一个能够产生整数值的方式,switch能将这个表达式的结果与每个Integral-value(整数值)相比较。若发现相符的就执行相应的语句(单一语句或多条语句,其中并不需要括号);若没有相符的,就执行default语句。

每一个case均以一个break结尾,这样可使执行流程跳转至switch主体的末尾;但break是可选的,若省略break,会继续执行后面的case语句,直到遇到一个break为止。

最后的default没有break但如果你想,也可以加上,但不会有任何实际用处。

switch语句是实现多路选择的一种干净利落的方法,但它要求使用一个选择因子,并且必须是int或char那样的整数值;在后面将会看到enum和switch的协调工作。

例子:

结果:

 

Random.nextInt(26)会产生0到26之间的一个值,所以在其上加上一个偏移量"a",即可产生小写字母;在case语句中,使用单引号引起的字符也会产生用于比较的整数值。

原文地址:https://www.cnblogs.com/ifreewolf/p/11207159.html