本次主要记录控制流程相关的知识点,主要介绍以概念为主。相关知识点有:块,条件语句,循环语句,多重选择switch,中断控制流程。
一、块作用域
块(即复合语句)是指由若干条Java语句组成的语句,并用一对大括号括起来。块确定了变量的作用域。一个块可以嵌套在另一个块中。
public static void main(String[] args){
int n;
...
{
int k;
...
}//k is only defined up to here
}
但是,不能再嵌套的两个块中申明同名的变量,因为在内层定义的变量会覆盖在外层定义的变量。这就有可能带来变成错误,因此Java 中不允许这样做。
public static void main(String[] args){
int n;
...
{
int k;
int n;//ERROR--can't redefine n in inner block
...
}
}
二、条件语句
在Java 中,条件语句的形式为
if(condition) statement
if(yourSales >= trager){
performance = "Statisfactory";
bonus = 100;
}
if(condition) statement₁ else statement₂
if(yourSales >= target){
performance = "Satisfactory";
bonus = 100+0.01*(yourSales - target);
}else{
performance = "Unstatisfactory";
bonus = 0;
}
其中else部分总是可选的。else子句与邻近的if构成一组。因此在语句
if(x<=0) if(x==0) sign = 0;else sign = 1;
中else 与第2个if配对。反复使用if...else if...很常见
三、循环
当条件为true时,while循环执行一条语句(也可以是一个块语句)。一般形式如下
while(condition) statement
while(balance < goal){
balance += payment;
double interest = balance * interestRate / 100;
years++
}
System.out.println(years+" years.");
while循环语句在最前面检测循环条件。因此,循环体中的代码有可能一次都不会执行。如果希望循环体至少执行一次,需要使用do/while循环,将检测放在最后语法如下
do statement while(condition)
do{
balance+=payment;
double interest = balance * interestRate / 100;
balance += interest;
year++;
//print current balance
...
//ask if ready to retire and get input
...
}while(input.euqals("N"))
四、确定循环
for循环语句是支持迭代的一种通用结构,由一个计数器或类似的变量控制迭代次数,每次迭代后这个变量会更新。
//循环打印1~10
for(int i = 0;i<10;i++){
System.out.println(i);
}
for语句的第一部分通常是计数器的初始化,第二部分给出每次新一轮循环执行前要检测的循环条件,第三部分指定如何更新计数器。
与c++一样,尽管允许for循环的各个部分放置任何的表达式,但是有一条不成文的规则,for语句的3个部分应该对同一个计数器变量进行初始化、检测和更新。若不遵守这个规则,编写的循环常常晦涩难懂。
在循环中,检测两个浮点数是否相等需要格外小心。下面的for循环
for(double x = 0; x!=10; x+=0.1)...
可能永远不会结束,由于四舍五入的误差,可能永远达不到精确的最终值。例如,在上面的循环中,因为0.1无法精确地使用二进制表示,所以,x将从9.999 999 999 999 98 跳到10.099 999 999 999 98。
当在for语句的第一部分中声明了一个变量后,这个变量的作用域就扩展到这for循环的的末尾
for(int i = 0; i<=10; i++){
...
}
//i no defined here
特别指出,如果在for语句中定义一个变量,这个变量就不能再循环体外使用。因此,如果希望在for循环体之外使用循环计数器的最终值,就要确保这个变量在循环之外声明。
int i;
for(int i=0; i<=10; i++){
...
}
//i is still defined here
可以在不同的循环中定义同名的变量
for(int i = 0; i<10;i++){
...
}
for(int i = 0;i<20;i++){
...
}
五、多重选择 switch语句
在处理多个选项时,使用if/else结构显得有些笨拙。Java 有一个与c++完全一样的switch语句
例如:建立一个包含四个选项的菜单系统,可以使用下列代码:
Scanner in = new Scanner(System.in);
System.out.print("Select an option (1,2,3,4)");
int choice = in.nextInt();
switch(choice){
case 1:
...
break;
case 2:
...
break;
case 3:
...
break;
case 4:
...
break;
default:
//bad input
...
break;
}
switch语句将从选项值相匹配的case标签开始执行,直到遇到break语句,或者执行到switch语句的结束处终止。如果没有相匹配的case标签,而又default子句,就执行这个子句。
case标签可以是:
- 类型为char 、byte、shor或int的常量表达式。
- 枚举常量
- 从java7开始,case标签还可以是字符串字面量
六、中断控制流程语句
1.break
与用与退出switch 语句的break语句一样,它也可以退出循环语句。
while(years <=100){
balance +=pament;
double interest = balance * interestRate / 100;
balance += interest;
if(balance >=goal) break;
years++;
}
与c++不同,Java还提供了一种 带标签的break语句。用于跳出多重嵌套的循环语句。
有时候,在嵌套很深的循环语句中会发生一些不可预料的事情。此时可能更加希望完全跳出所有的嵌套循环外。如果只是为各层循环检测添加一些额外的条件,这会不方便。
下面示例说明了break语句的工作状态。请注意,标签必须放在希望跳出的最外层循环之前,并且必须紧跟一个冒号。
Scanner scanner = new Scanner(System.in);
int n;
read_data:
while(...)//this loop statement is tagged with label
{
...
for(...)//this inner loop is not labeled
{
System.out.print("Enter a number >= 0:");
n = in.nextInt();
if(n<0)//should never happen -cant´ t go on
break read_data;
//break out of read_data loop
...
}
}
//this statement is excuted immediately after the labled break
if(n<0){ check for bad situation
//deal with bad sitution
}
else
{
//carry out normal processing
}
实时上,可以将标签应用到任何语句,甚至可以将其应用到if语句或者块语句如下
label:
{
...
if() break label;//exit block
}
//jumps here when the break statement executes
因此,如果确实希望使用goto语句,而且一个代码块恰好在你想要跳到的位置之前结束,就可以使用break语句。当然并不提倡使用这种方法。另外需要注意,只能跳出语句块,不能跳入语句块。
2.continue
与break语句一样,它将中断正常的控制流程。continue语句将控制转移到最内层循环的首部。
Scanner in = new Scanner(System.in);
while(sum <goal){
System.out.print("Enter a number:");
n = in.nextInt();
if(n<0) continue;
sum+=n;//not executed if n<0
}
如果n<0,则continue 语句越过了当前循环体的剩余部分,立刻跳到循环首部。
如果将continue语句用于for循环中,就可跳到for循环的“”更新“部分。例如,下面这个循环
for(int i = 0;i<=100;i++){
System.out.ptint("Enter a number ,-1 to quit:");
n = in.nextInt();
if(n<0) continue;
sum+=n;//not executed if n<0
}
如果n<0 则continue 语句将跳到i++语句
还有一种带标签的continue语句,将跳到与标签相匹配的循环首部。
文章内容均摘抄自Java核心技术卷Ⅰ,用作知识点记录