Java核心技术卷I知识点总结三

本次主要记录控制流程相关的知识点,主要介绍以概念为主。相关知识点有:块,条件语句,循环语句,多重选择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核心技术卷Ⅰ,用作知识点记录

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值