疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

Java中标签的使用


 

  很多程序设计语言中有goto语句,goto语句的使用,使的程序变得难以读懂,尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用;Java没有goto。然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子。它并不属于一次跳转,而是中断循环语句的一种方法。之所以把它们纳入goto问题中一起讨论,是由于它们使用了相同的机制:标签。

  下面是一个例子,介绍一下这种标签在java中的使用。

  inti = 0;

  System.out.println("label1");

  label1:for(intk = 0; k < 5; k++) {

  i++;

  if(k == 2) {

  breaklabel1;

  }

  System.out.println(i);

  }

  输出结果是:

  label1

  1

  2

  这说明当k=2时,执行了break语句,跳转到了label1标签处,但是并没有在进入这个for语句块。

  intj = 0;

  System.out.println("label2");

  label2:for(intk = 0; k < 5; k++) {

  j++;

  if(k == 2) {

  continuelabel2;

  }

  System.out.println(j);

  }

  输出结果是:

  label2

  1

  2

  4

  5

  这说明当k=2时,执行了continue语句,跳出了循环没有执行println语句,然后从label2标签的地方再次进入for语句块。

  上面这两种情况的结果与不使用标签的,只使用break和continue的情况是相同的。因而体现不出标签的作用。

  System.out.println("label3");

  inth = 0;

  label3:for(intk = 0; k < 5; k++) {

  System.out.println("label3第一层");

  for(intm = 0; m < 5; m++) {

  System.out.println("label3第二层");

  h++;

  if(m == 2) {

  breaklabel3;

  }

  System.out.println(h);

  }

  }

  输出结果是:

  label3

  label3第一层

  label3第二层

  1

  label3第二层

  2

  label3第二层

  这说明当k=m时,执行了break语句,跳转到了label3标签处,但是并没有在进入这个for语句块。

  System.out.println("label4");

  intl = 0;

  label4:for(intk = 0; k < 5; k++) {

  System.out.println("label4第一层");

  for(intm = 0; m < 5; m++) {

  System.out.println("label4第二层");

  l++;

  if(m == 2) {

  continuelabel4;

  }

  System.out.println(l);

  }

  }

  输出结果是:

  label4

  label4第一层

  label4第二层

  1

  label4第二层

  2

  label4第二层

  label4第一层

  label4第二层

  4

  label4第二层

  5

  label4第二层

  label4第一层

  label4第二层

  7

  label4第二层

  8

  label4第二层

  label4第一层

  label4第二层

  10

  label4第二层

  11

  label4第二层

  label4第一层

  label4第二层

  13

  label4第二层

  14

  label4第二层

  这说明当m=2时,执行了continue语句,跳出了循环没有执行println语句,然后从label3标签的地方再次进入for语句块。

  当有多从循环的时候,程序只想跳出内层循环,而不跳出外层循环的时候就可以使用这样的break和continue标签了。这种嵌套循环也是适合while语句的。

  当然你也可以写出这样的代码

  label5:{

  intb=0;

  if(tag){

  breaklabel5;

  }

  ......

  }

  用以跳过下面省略了的代码,当然这样的写法完全可以使用if else代替。

  下面是对这个用法的总结:

  (1)简单的一个continue会退回最内层循环的开头(顶部),并继续执行。

  (2)带有标签的continue会到达标签的位置,并重新进入紧接在那个标签后面的循环

  (3) 简单的一个break会中断当前循环,并移离当前所在循环的末尾。

  (4)带标签的break会中断当前循环,并移离由那个标签指示的循环的末尾。