就像有知觉的生物一样,程序必须在执行过程中控制它的世界,并做出选择。在java中,你要使用执行控制语句来做出选择。
一、true和false
所有条件语句都利用条件表达式的真或假来决定执行的路径。这里有一个条件表达式的例子:a==b。它用条件操作符“==”来判断a值是否等于b值。该表达式返回true或false。所有的关系操作符,都可以拿来构造条件语句。如果想在布尔测试中使用一个非布尔值,比如在if(a)中,那么首先必须用一个条件表达式将其转换成布尔值,例如if(a!=0)。
二、if-else
if-else语句是控制程序流程的最基本的形式。其中的else是可选的,所以可按下述两种形式来使用if:
if(Boolean-expression) statement// 或if(Boolean-expression)statementelsestatement
布尔表达式必须产生一个布尔结果,statement指用分号结尾的简单语句,或复合语句(封闭在花括号内的一组简单语句)。
作为if-else的一个例子,下面这个test()方法可以告诉你,你猜的数是大于、小于还是等于目标数:
public class IfElse {static int result = 0;static void test(int testval, int target) {if (testval > target)result = +1;else if (testval < target)result = -1;elseresult = 0;}public static void main(String[] args) {test(10, 5);System.out.println(result);test(5, 10);System.out.println(result);test(5, 5);System.out.println(retult);}
}
test()的中间部分,可以看到一个“else if”,那并非新的关键字,而仅仅只是一个else后面紧跟着另一个新的if语句。
三、迭代
while、do-while和for用来控制循环,有时将它们划分为迭代语句(iteration statement)。语句会重复执行,直到起控制作用的布尔表达式(Booleanexpression)得到“假”的结果为止。
while循环的格式如下:
while(Boolean-expression) statement
在循环刚开始时,会计算一次布尔表达式的值;而在语句的下一次迭代开始前会再计算一次。
下面这个简单的例子可产生随机数,直到符合特定的条件为止:
public class WhileTest {static boolean condition() {boolean result = Math.random() < 0.99;System.out.println(result + ", ");return result;}public static void main(String[] args) {while (condition())System.out.println("Inside 'while'");System.out.println("Exited 'while'");}
}
condition()方法用到了Math库里的static方法random(),该方法的作用是产生0和1之间(包括0不包括1)的一个double值。result的值是通过比较操作符<而得到它,这个操作符将产生boolean类型的结果。在打印boolean类型的值时,将自动地得到适合的字符串true或false。while的条件表达式意思是说:“只要condition()返回true,就重复执行循环体中的语句”。
(1)do-while
do-while格式如下:
dostatementwhile(Boolean-expression)
while和do-while唯一的区别就是do-while中的语句至少会执行一次,即便表达式第一次就被计算为false。而在while循环结构中,如果条件第一次就为false,那么其中的语句根本就不会执行,在实际应用中,while比do-while更常用一些。
(2)for
for循环可能是最经常使用的迭代形式,这种在第一次迭代之前要进行初始化。随后,它会进行条件测试,而且在每一次迭代结束时,进行某种形式的“步进”。for循环的格式如下:
for(initialization;Boolean-expression;step) statement
初始化(initialization)表达式,布尔表达式(Boolean-expression),或者步进(step)运算,都可以为空。每次迭代前会测试布尔表达式。若获得的结果是false,就会执行for语句后面的代码行。每次循环结束,会执行一次步进。
for循环常用于执行“计数”任务:
public class ListCharacters {public static void main(String[] args) {for (char c = 0; c < 128; c++) {if(Character.isLowerCase(c))System.out.println("value:"+(int)c+" Character:"+c);}}
}
注意,变量c是在程序用到它的地方被定义的,也就是在for循环的控制表达式里,而不是在main()开始的地方定义的。c的作用域就是for控制的表达式的范围内。
这个程序也使用了java.lang.Character包装器类,这个类不但能把char基本类型的值包装进对象,还提供了一些别的有用的方法。这里用到了static isLowerCase()方法来检查问题中的字符是否为小写字母。
(3)Foreach语法
java SE5引入了一种新的更加简洁的for语法用于数组和容器,即foreach语法,表示不必创建int变量去对由访问项构成的序列进行计算,foreach将自动产生每一项。
例如,假设有一个float数组,我们要选取该数组中的每一个元素:
public class ForEachFloat {public static void main(String[] args) {Random r = new Random(47);float[] f = new float[10];for (int i = 0; i < 10; i++)f[i] = r.nextFloat();for (float x : f)System.out.println(x);}
}
这个数组使用旧式的for循环组装的,因为在组装时必须按索引访问它。在下面这行中可以看到foreach语法:
for (float x : f)
这条语句定义了一个float类型的变量x,继而将每一个f的元素赋值给x。
任何返回一个char数组,因此可以很容易地像下面这样迭代在字符串里面的所有字符:
public class ForEachString {public static void main(String[] args) {for (char c : "An African Swallow".toCharArray()) {System.out.println(c+" ");}}
}
foreach语法不仅在录入代码时可以节省时间,更重要的是,它阅读起来也要容易得多,它说明您正在努力做什么(例如获取数组中的每一个元素),而不是给出你正在如何做的细节(例如正在创建索引,因此可以使用它来选取数组中的每一个元素)。我们之要有可能就应该使用foreach语法。