Java编程思想学习笔记(七)

第四章 控制执行流程

也是经典的基础章节,找没见过的记一下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

 

上一篇:Java内部类


下一篇:Java常用类之内部类