Java中的"goto"实现
Java语言中goto是保留关键字,没有goto语句,也没有任何使用goto关键字的地方。
Java中也可在特定状况下,经过特定的手段,来实现goto的功能。显然Java不肯意开发者随意跳转程序。下面解释两个特定:
特定状况:只有在循环体内,好比for、while语句(含do...while语句)中。
特定手段:语句标签和循环控制关键字break、continue,语法格式是:break/continue 语句标签。
1、break、continue和语句标签
一、语句标签
语句标签的语法是:标签名:
语句标签能够定义在方法体内的最后一条语句以前便可。可是语句标签实际使用的机会是与break和continue结合使用的,而break和continue是和循环语句结合使用的,所以实际上语句标签的使用也是和循环紧密结合的。
语句标签在被使用的状况,只能定义在循环迭代语句以前,不然编译出错!
所以,有意义、可以使用的标签含义是:指定循环语句的标识!
二、break、continue语句单独使用
单独使用状况下:break语句做用是结束当前的循环迭代体,进而执行剩余的语句。
continue语句的做用是结束本次迭代过程,继续执行下一轮迭代。
三、break、continue语句结合语句标签的使用
为何须要语句标签呢?
缘由是由于程序可能有循环的嵌套,当多层循环嵌套时候,有时候须要一次跳出多级循环,这种状况下就须要结合语句标签才能实现此功能了。
带标签使用状况下:break中断并跳出标签所指定循环,continue跳转到标签指定的循环处,并继续执行该标签所指定的循环。
为了说明状况,看看下面的例子:
import java.util.Random;
/**
* 语句标签测试
*
* @author leizhimin 2009-7-16 11:43:08
*/
public
class TestLable {
public
static
void main(String[] args) {
outer:
for (
int i = 0; i < 10; i++) {
System.out.println(
"\nouter_loop:" + i);
inner:
for (
int k = 0; i < 10; k++) {
System.out.print(k +
" ");
int x =
new Random().nextInt(10);
if (x > 7) {
System.out.print(
" >>x == " + x +
",结束inner循环,继续迭代执行outer循环了!");
continue outer;
}
if (x == 1) {
System.out.print(
" >>x == 1,跳出并结束整个outer和inner循环!");
break outer;
}
}
}
System.out.println(
"------>>>全部循环执行完毕!");
}
}
执行结果:
outer_loop:0
0 1 2 3 4 5 6 7 8 9 >>x == 8,结束inner循环,继续迭代执行outer循环了!
outer_loop:1
0 1 2 3 4 5 >>x == 9,结束inner循环,继续迭代执行outer循环了!
outer_loop:2
0 1 2 3 4 5 6 7 8 9 >>x == 8,结束inner循环,继续迭代执行outer循环了!
outer_loop:3
0 1 2 3 4 >>x == 9,结束inner循环,继续迭代执行outer循环了!
outer_loop:4
0 1 2 3 4 5 6 7 8 9 10 >>x == 8,结束inner循环,继续迭代执行outer循环了!
outer_loop:5
0 >>x == 1,跳出并结束整个outer和inner循环!------>>>全部循环执行完毕!
Process finished with exit code 0
这个执行结果是随机的。
下面给个图看看:
2、switch语句
switch语句是一个条件选择语句,这个语句有“goto”的味道,可是限制也不少,所以,实际中使用较少。
switch语句的结构以下:
switch(intvar){
case intval: 语句代码;
break;
case intval: 语句代码;
break;
case intval: 语句代码;
break;
case intval: 语句代码;
break;
default:
语句代码;
}
switch(intval){...}语句中,小括号中intvar是一个整数条件因子变量,这个变量只能为:
byte、char、short、int和enum(枚举类型)几种类型,本质上都是×××数字。intval是匹配的条件因子值,当匹配时,执行其下的语句。其中全部的break语句都是可选的。当执行了break语句后,就跳出整个switch语句,不然,还会继续往下匹配别的条件。当intvar不能匹配全部的给定条件值时候,就执行default语句,若是没有default语句,则跳出switch语句。
switch语句的条件因子变量只能做为整型数字或者字符型、枚举类型,这个限制太严格了,使得switch语句的实际用途不是很大。
下面是一个汉语金额数字转换程序:
/**
* 汉语金额数字转换程序
*
* @author leizhimin 2009-7-16 13:28:05
*/
public
class TestSwitch {
/**
* 数字转换为汉语金额数字
*
* @param num 数字
* @return 汉语金额数字
*/
public
static String genCnNum(Long num) {
StringBuffer sb =
new StringBuffer();
String snum = String.valueOf(num);
for (
char c : snum.toCharArray()) {
sb.append(num2Cn(c));
}
return sb.toString();
}
/**
* 字符数字转换为汉语金额数字
*
* @param c 字符数字
* @return 汉语金额数字
*/
private
static String num2Cn(
char c) {
String res =
null;
switch (c) {
case '0':
res =
"零";
break;
case '1':
res =
"壹";
break;
case '2':
res =
"貮";
break;
case '3':
res =
"叁";
break;
case '4':
res =
"肆";
break;
case '5':
res =
"伍";
break;
case '6':
res =
"陆";
break;
case '7':
res =
"柒";
break;
case '8':
res =
"捌";
break;
case '9':
res =
"玖";
break;
default:
System.out.println(
"您的输入有误,请重试!");
}
return res;
}
public
static
void main(String[] args) {
System.out.println(genCnNum(4523586022L));
}
}
运行结果:
肆伍貮叁伍捌陆零貮貮 Process finished with exit code 0