1、Java中与流程控制相关的关键字包括:if-else,switch,while,do-while,for,return,break,continue。注意,其中并不包括goto语
句,但是在Java中仍然可以进行类似goto那样的跳转。
2、Java里唯一用到逗号操作符的地方就是for循环的控制表达式——使用一系列逗号分隔的语句,而且那些语句均会独立执行。
3、foreach循环
(1)使用场合
1)数组可以使用foreach,例如:
for(char c : “An African Swallow”.toCharArray()){
System.out.print(c + “ ”);
}
2)foreach还可以用于任何Iterable对象。
(2)要使自定义类支持foreach循环
1)可以让该类实现Iterable<T>接口并重写其中的
public Iterator<T> iterator() //返回一个自定义Iterator对象;
2)自定义Iterator对象可以通过在自定义类中作为一个内部类来写,该内部类需要实现Iterator<T>接口,因而必须重写其中的如下2
个方法:
public boolean hasNext()
public String next()
3)例子:
package com.hemeng.study.chapter4.demo;
import java.util.Iterator;
/**
* 装有很多水果的果篮,用于练习Iterable接口
*
* @author hemeng
*
*/
public class FruitBasket implements Iterable<String> {
private int size;
private int currentIndex;
private String[] fruit;
public FruitBasket(){
this.size = 20;
this.currentIndex = 0;
this.fruit = new String[size];
}
/**
* construct a basket with the specific size.
*
* @param size
*/
public FruitBasket(int size){
this.size = size;
this.currentIndex = 0;
this.fruit = new String[size];
}
/**
* add a fruit to the basket.
*
* @param fruitName
*/
public void add(String fruitName){
if(this.currentIndex < size){
this.fruit[this.currentIndex++] = fruitName;
}
}
@Override
public Iterator<String> iterator() {
// TODO Auto-generated method stub
return new FruitIterator();
}
/**
* 内部类用作“public Iterator<String> iterator()”返回的迭代器
*
* @author hemeng
*
*/
class FruitIterator implements Iterator<String> {
private int index = 0;
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return index != fruit.length;
}
@Override
public String next() {
// TODO Auto-generated method stub
return fruit[index++];
}
}
}
4、在switch语句中,case后面的选择因子必须是int或char那样的整数值(也可以是枚举类型),而对于非整数类型(例如:字符串
或者浮点数)则必须选用一系列if语句来实现。
5、continue和break语句
(1)不带标签时,这两个语句默认相对于当前循环(最内层while,do-while,for或foreach循环)。continue语句表示跳过当前循环
本次循环的剩余语句,直接开始当前循环的新的一次循环,而break则表示跳过当前循环的剩余语句,并且不在执行当前循环的其它
次循环;
(2)带标签。
标签的用法一般作如下限制:1)标签紧放在循环语句开始之前;2)标签通常只用于嵌套循环的跳转。
带标签的continue和break语句不再以当前循环为默认循环,而是根据其后的标签所对应的循环进行跳转。例如:
label1:
outer-iteration {
inner-iteration {
//...
break; //(1)
//...
continue; //(2)
//...
continue label1; //(3)
//...
break label1; //(4)
}
}
在(1)中,break中断内部迭代,回到外部迭代。在(2)中,continue使执行点移回内部迭代的起始处。在(3)中,continuelabel1同时
中断内部迭代,直接转到label1处;随后,它实际上是继续迭代过程,但却从外部迭代开始。在(4)中,breaklabel1也会中断所有迭
代,并回到label1处,但并不重新进入迭代。也就是说,它实际是完全中止了两个迭代。
参考资料: