1.Java中的goto
goto是Java中的一个保留字,但是语言中并未使用它;但是Java也能完成一些类似于跳转的操作,那就是通过:break、continue两个关键字和标签来实现。
当然,Java只是利用break和continue来中断迭代,它类似于goto,但没有goto那么灵活,唯一最相似的地方就是它们都使用了标签。
在Java中,标签起作用的唯一地方就是在迭代语句之前,也就是for循环和while循环之前,并且标签和循环语句之间不能再有任何其他语句。
要记住的重点是:在Java里需要使用标签的唯一理由就是因为有循环嵌套的存在,并且想从多层嵌套中break和continue。
先看下述的例子:
public static void test2() {
outer: for (int i = 0; i < 10; i++) {
System.out.println("i = " + i);
for (int j = 0; j < 10; j++) {
if(j == 1){
continue;
}
System.out.println("j = " + j);
if(j == 3){
continue outer;
}
}
}
}
外层循环使用outer标签来标识。在内层循环中,当j==3
时,我们想要跳过外层循环的本次循环而进入下一次循环,所以就必须使用continue outer
来实现了。这时,程序会跳转到outer标签指示的位置,并且进入下一次循环。
当然,如果这里我们写成break outer
,那么程序会直接跳到outer处,但是不执行循环了,也就是说程序会直接终止外层循环,那么同样的,内层循环也被一并终止了。
上述分析对于while循环也是一样的。
【规则总结如下】:
(1)一般的continue会退回最内层循环的开头,并继续执行
(2)带标签的continue会达到标签的位置,并重新进入紧接在那个标签后面的循环。
(3)一般的break会中断并跳出当前循环
(4)带标签的break会中断标签所指的循环。
2.枚举类
在Java还没有引入枚举类型之前,我们表示枚举类型需要创建一个整型常量集,比如,我们用数字1代表红色,数字2代表绿色,数字3代表白色,数字4代表黄色,定义代码如下:
public class Color{
public static final int RED = 1;
public static final int GREEN = 2;
public static final int WHITE = 3;
public static final int YELLOW = 4;
}
这种方法称为int枚举模式,但是这个模式有一个问题,就是这些枚举值并不会必然地将其自身的取值限制在这个常量集的范围之内,所以它们是有风险的。所以,从Java SE5之后,Java也引入了枚举类型:
枚举类型(enum type)是指由一组固定的常量组成合法的类型。Java中由关键字
enum
来定义一个枚举类型。
现在,我们可以将上面的Color类更改成枚举类型:
public enum Color{
RED,GREEN,WHITE,YELLOW
}
在其他类中,我们可以直接使用这个枚举类中的常量,如下:
public class Main{
public static void main(String[] args){
Color red = Color.RED;
System.out.println(red);
}
}
这个测试程序就会输出:RED
。
在我们创建enum的时候,编译器会自动添加一些有用的特性,它会自动创建toString()
方法,我们如果覆盖了toString()
方法,也可以通过name()
方法返回常量字符串;编译器也会创建ordinal()
方法,用来表示某个特定enum常量的声明顺序,以及静态的values()
方法,该方法按照enum常量的声明顺序,产生由这些常量值构成的数组。
如下测试:
public class Main {
public static void main(String[] args) {
for(Color color:Color.values()){
System.out.println(color.name() +" ,ordinal:"+color.ordinal());
}
}
}
输出如下:
另外,我们也可以在枚举类型中定义新的变量,定义新的方法。
比如下述例子:
public enum Color {
RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLOW("黄色", 4);
private String name;
private int index;
private Color(String name, int index) {
this.name = name;
this.index = index;
}
public int getIndex(){
return this.index;
}
public String getName(){
return this.name;
}
@Override
public String toString() {
return this.index+"_"+this.name;
}
}
我们可以为枚举常量定义了name
和index
属性,我们可以利用这两个属性做更多的事情,测试如下:
public class ColorUse {
public static void main(String[] args) {
System.out.println(Color.GREEN);
System.out.println(Color.BLANK.getIndex());
System.out.println(Color.YELLOW.getName());
System.out.println("-------------");
System.out.println(Color.RED.equals(Color.RED));
System.out.println(Color.RED == Color.RED);
System.out.println("-------------");
for(Color color:Color.values()){
System.out.println(color.name()+", ordinal "+color.ordinal());
}
}
}
输出结果: