流程控制
1. switch
switch
语句的语法格式为:
switch (expression){
case condition1: {
statement(s)
break;
}
case condition2: {
statement(s)
break;
}
...
case conditionN: {
statement(s)
break;
}
default: {
statement(s)
}
}
switch
语句后面的控制表达式的数据类型只能是byte
,short
,char
,int
,String
,Enum
类型。纵然这些分支里的
break
语句可选择省略,但请务必清楚其省略后的后果:如果某个case
条件中没有break
语句,则如果该条件匹配中后,后面的所有case
会无条件执行。也就是说,对于下面的语句:
@Test public void test() { int x = 1; switch (x) { case 1: System.out.println(1); case 2: System.out.println(2); case 3: System.out.println(3); default: System.out.println("default"); } }
其会输出:
1 2 3 default
由于
switch
语句中各case
标签后代码块的开始点和结束点非常清晰,因此完全可以省略case
后代码块的花括号。
其实,通常情况下在程序中没有必要使用switch
语句,如果你单纯地喜欢这种语法的话,可以选择在编译代码时加上-Xlint:fallthrough
选项,即javac -Xlint:fallthrough Test.java
,这样一来,如果某个分支最后缺少一个break
语句,编译器就会给出一个警告信息。
2. for
对于for
循环语句,建议不要在循环体偿修改循环变量的值,否则会增加程序出错的可能性。
3. break
break
语句不权可以结束其所在的循环,还可以直接结束其外层循环,此时需要在break
后紧跟一个标签,这个标签用于标识一个外层循环。Java中的标签就是一个紧跟着英文冒号(:
)的标识符,与其他语句不同的是,Java中的标签只有放在循环语句之前才有作用。
public class BreakTest2{
public static void main(String[] args){
// 外层循环,outer作为标识符
outer:
for (int i = 0; i < 5; i++){
// 内层循环
for (int j = 0; j < 3; j++){
Systemt.out.println("i的值为:" + i + " j的值为:" + j);
if (j == 1){
// 跳出outer标签所标识的循环
break outer;
}
}
}
}
}
4. continue
continue
语句在语法上与break
类似,也可跟一个标签用于直接跳出标签所标识的循环。
5. foreach
语法:
for (type variableName : array | collection){
// …
}
当使用foreach
循环来迭代输出数组元素或集合元素时,通常不要对循环变量进行赋值,虽然这在语法上允许,但其实没有多大的实际意义,且极易引发错误:
public class ForEachErrorTest{
public static void main(String[] args){
String[] books = {"轻量级JavaEE企业应用实战",
"疯狂Java讲义",
"疯狂Android讲义"};
// 使用foreach循环来遍历数组元素,其中book将会自动迭代每个数组元素
for (String book : books){
book = "疯狂Ajax讲义";
System.out.println(book);
}
System.out.println(books[0]);
}
}
// 输出:
// 疯狂Ajax讲义
// 疯狂Ajax讲义
// 疯狂Ajax讲义
// 轻量级JavaEE企业应用实战
不难看出,当使用foreach
来迭代访问数组元素时,foreach
中的循环变量相当于一个临时变量,该变量只不过“临时”引用了数组元素对应位置的值,当向该临时变量重新赋值时,含义是该临时引用变量更改了其指向,其指向新的赋值的位置,而非更改了数组元素的值。