总结java中所有的与流程控制有关的知识
(1)表达式判断
Java中只允许true或者false来作为判断条件,不允许用0或者非0值作为判断条件。
(2)if-else
与流程密切相关的语句,决定了语句应该往哪个方向发展,与代码的逻辑结构密切相关。
(3)迭代
下面的语句被划分为迭代语句。
(A)while/do-while
两者的唯一区别就是do-while中的语句至少会被执行一次,即是表达式里面的值一开始计算就是false。但对于while,如果第一次计算的结果是false,则循环体里的语句不会执行。
(B)for
for循环中要注意的首先是,初始化表达式,布尔表达式,步进运算都可以为空。另外一个就是for循环是Java中唯一用到了逗号操作符的地方,在控制表达式的三个部分中,可以使用一系列由逗号分隔的语句,并且这些语句会独立执行。在一个控制表达式中,定义多个变量的能力只限于for循环使用。
(C)foreach语法
foreach语法不必要创建int变量去对由访问项构成的序列进行计数。例如如下的几个例子。
分开输出一个字符串中的所有字符:
1 public class test { 2 public static void main(String[] args){ 3 String s = "don‘t look back in anger"; 4 for(char c : s.toCharArray()) 5 System.out.print(c + " "); 6 } 7 } 8 9 output: 10 d o n ‘ t l o o k b a c k i n a n g e r
foreach语法不仅能够节省时间,更重要的是能够努力说明你正在做的事情,比如把数组中的每一个元素都获取出来。
(4)return
return语句指明你希望在何处让方法返回或者退出,或返回一个什么样的值。
(5)break和continue
break退出当前的迭代,continue退出当前这一次迭代然后开始进行下一次迭代。
(6)goto与标签
在Java中,实际上没有goto语句的支持,但是Java中有类似的机制存在,即标签。在Java中,标签唯一起作用的地方是在迭代语句之前,这句话的内涵在于,在标签和迭代语句之间插入任何语句都是不合适的。几种label的行为机制如下。
1 label1: 2 outer-iteration{ 3 inner-iteration{ 4 break; (1) 5 continue; (2) 6 continue label1; (3) 7 break label1; (4) 8 } 9 }
在(1)中,break中断内部迭代,回到外部迭代。(2)中,continue中断当前内部迭代,继续进行当前内部迭代。(3)中,continue中断当前迭代,重新从label1处进入外部迭代。(4)中,break中断所有迭代,并且不再进入外部迭代。下面是一个label用于for循环的例子。
1 public class test { 2 public static void main(String[] args){ 3 int i = 0; 4 outer: 5 for(;true;) 6 inner: 7 for(;i < 10; i++){ 8 System.out.println("i = " + i); 9 if(i == 2){ 10 System.out.println("continue"); 11 continue; 12 } 13 if(i == 3){ 14 System.out.println("break"); 15 i++; 16 break; 17 } 18 if(i == 7){ 19 System.out.println("continue outer"); 20 i++; 21 continue outer; 22 } 23 if(i == 8){ 24 System.out.println("break outer"); 25 break outer; 26 } 27 for(int k = 0;k < 5; k++){ 28 if(k == 3){ 29 System.out.println("continue inner"); 30 continue inner; 31 } 32 } 33 } 34 } 35 }
这个例子中一个有趣的地方是,如果将15行的i++注释掉的话,程序会陷入死循环。这告诉我们在for循环体中,循环中的代码执行完后的最后一句才是步进操作,如果在之前用break语句退出循环,步进操作不会执行。细心的话可以发现在11行的continue之前并没有手动给i进行步进,但是步进操作还是进行了,这说明单个的continue在进行下一次内层循环的同时仍然可以进行自增操作。但是21行的continue加标签的上一句,需要手动给i进行步进,这是因为这种continue的形式不会继续进行循环体中的步进操作了,而是直接跳转到标签代码处。
规则总结为:
(1)单个的continue会终止当前循环并且回到内层循环的头部重新开始(步进,判断等操作仍然会执行)。
(2)continue后跟标签会无条件跳转至标签处。
(3)单个的break会终止并且跳出当前循环(只能跳出内层)。
(4)break加标签可以中断并跳出标签所指的循环。
(7)switch
switch更多的时候被划分为一种选择语句,根据整数表达式的值,switch语句可以从一系列代码中选择一段执行。
switch的标准格式如下:
1 switch(integral-selector){ 2 case integral-value1 : statement : break; 3 case integral-value2 : statement : break; 4 case integral-value3 : statement : break; 5 case integral-value4 : statement : break; 6 case integral-value5 : statement : break; 7 default: statement; 8 }
其中,integral-selector称作整数选择因子,是一个能够产生整数值的表达式,switch语句将这个值与每一个integral-value比较,如果发现相等的,就选择执行,否则就执行再default里面的语句。每个case都以一个break结尾,如果有这个break存在,程序会在结束时跳出switch结构体,反之会继续进行,直到遇到一个break为止。switch是一个实现多路选择的有利工具,但是只能使用char或者int这样的整数值,但是与enum相联系可以减弱这种限制。
下面是一个使用switch的例子。
1 public class test { 2 public static void main(String[] args){ 3 String s = "though nothing can keep us together"; 4 for(char c : s.toCharArray()){ 5 switch(c){ 6 case ‘a‘: 7 case ‘e‘: 8 case ‘i‘: 9 case ‘o‘: 10 case ‘u‘:System.out.println(c + " is vowel"); 11 break; 12 default:System.out.println(c + " is not vowel"); 13 } 14 } 15 } 16 }
多个case可以重叠在一起,形成多重匹配,只要符合那些条件中的一种,就会执行那一段代码。