第四章 控制执行流程
也是经典的基础章节,找没见过的记一下8.
1.foreach语法:
float f[] = new float[10]; for(float x : f){ System.out.println(x); } //其实就是一种遍历的简化写法
for(char c : "Hello world!".toCharArray()){ System.out.println(c); } //toCharArray()是String类中的一个方法,会返回一个char数组
2.关于goto:
goto语句是在源码级别上的跳转,这也是其饱受诟病的地方,如果一个程序总是从一个地方直接跳转到另一个地方继续运行,那么其控制流程将变得难以识别。
Java中没有直接使用goto这个关键字,但是也有一些类似于这个功能的操作,涉及到break和continue。
goto语句的核心并不在于goto的跳转,而是在于标签,也就是”跳转到哪“
标签就是后面跟有冒号的标识符,例如"label1:"
在Java中,标签唯一的用处刚好是在迭代语句之前,也就是在标签和迭代语句之间插入任何的语句都是不合适的。理由是:我们希望在其中嵌套另外一个迭代或者一个开关。
label1: outer-iteration{ inner-iteration{ //... break;//(1) //... continue;//(2) //... continue label1;//(3) //... break label1;//(4) } }
(1)break中断了内部迭代,回到外部迭代
(2)continue使执行点移回内部迭代的起始处
(3)continue label1同时中断内部迭代和外部迭代,直接转到label1处继续执行,也就是从外部迭代进行接下来的过程
(4)break label1也会同时中断内外两个迭代,并回到label1处,但是不会重新进入迭代,也就是完全终止两个迭代
public class JavaLabel { public static void main(String[] args){ int i = 0; //外部循环 outer: for(;true;){ //内部循环 inner: for(; i < 10; i++){ System.out.println("i=" + i); if(i == 2){ System.out.println("continue"); continue; } if(i == 3){ System.out.println("break"); i++; break; } if(i == 7){ System.out.println("continue outer"); i++; continue outer; } if(i == 8){ System.out.println("break outer"); break outer; } for(int k = 0; k < 5; k++){ if(k == 3){ System.out.println("continue inner"); continue inner; } } } } } }
输出:
i=0 continue inner i=1 continue inner i=2 continue i=3 break i=4 continue inner i=5 continue inner i=6 continue inner i=7 continue outer i=8 break outer
从上面的例子可以看出,break label的写法可以用于跳出多层循环,continue label和正常的continue一样,会将循环的自增部分执行之后跳转到标签位置继续执行。
public class LabeledWhile { public static void main(String[] args){ int i = 0; outer: while (true){ i++; System.out.println("i = " + i); if(i == 1){ System.out.println("continue"); continue; } if(i == 3){ System.out.println("continue outer"); continue outer; } if(i == 5){ System.out.println("break"); break; } if(i == 7){ System.out.println("break outer"); break outer; } } } } //输出结果 // i = 1 // continue // i = 2 // i = 3 // continue outer // i = 4 // i = 5 // break
上面的例子是label用于while循环的,原理同for例,为了确保自加能够执行,将i++放在了循环体的开头进行执行。
总之,所谓goto有害的根本不是goto,而是标签,程序的标签变多会使程序的错误变多并且难以分析程序。但是Java的标签仅仅用于多层嵌套循环的跳出,这种限制语句能力的方法减少了由标签造成的问题。
2.13上传 第四章读完
P109