有写的不好的地方希望大牛们知道一下,小白刚上路,嘿嘿
今天突然看到了goto这个古老级的关键词,在学习java的时候基本所有的讲师都不会去提及,虽然java中没有goto,但是也保留了一些完成类似goto的跳转。来看的时候是抱着看一看这个控制流程到底有多烂的态度来的,不过还是吸取了其中的一点精华,发现他也并不是一点用没有。
首先先介绍一下goto,起源于汇编语言的程序控制,就是若条件A成立,则跳到这里,否则跳到那里。当我看到这句话的时候第一反应是,跳来跳去会不会乱呀,哈哈,他往哪跳,继续往下看。果然,大部分人给的评价是一个程序总是从一个地方跳到另一个地方,还有什么办法能识别程序的控制流程?不过最主要的原因好像是goto语句是在源码级上的跳转,使其招来了不好的声誉。
那么我们来具体看一下java中的类似goto的方法是怎么实现的。首先他与break和continue俩个关键词有关,再深入一点其实不是一个跳转,而是终端迭代语句的一种方法。与goto相同的是他们使用了同一机制:标签。
哈哈哈,什么是标签,我一开始也挺懵逼,他就是后面跟有冒号的标识符,比如lable:名字瞎写的。他的位置很有讲究,只能放在迭代语句刚好之前,就是标签后面直接跟循环,中间什么也不加,否则不起作用。懂?怎么去理解这个标签,就像你看书,在有的地方夹上书签,当你阅读到后面不懂的问题的时候就会跳回来找这个标签,这样说应该已经了解一些了吧。下面我们通过小程序来表示以下这个跳。
public static void main(String[] args) {
lable://标签,后面直接跟上迭代,否则无效报错
for(;;) {
int i=0;
for(;i<10;i++) {
System.out.println(i);
if(i==6) {
break lable;
}
}
}
}
输出0123456,我们知道break只能跳出最近的一层循环,这样他就跳的远啦,直接跳到lable标签处,并且不再执行。我们再来看
public static void main(String[] args) {
lable:
for(;;) {
int i=0;
for(;i<10;i++) {
System.out.println(i);
if(i==6) {
continue lable;
}
}
}
}
这个程序输出是无限循环0123456。和break还是有区别的是吧,break跳到标签出就停止运行了,但是continue跳到标签处继续执行。我想不用我多说大家也应该明白了这个到底是什么东西。
咋用?有啥用?记住啦,在java里使用标签的唯一理由就是因为有循环嵌套存在,而且想从多层嵌套中break或continue。我看了许多资料大家反对的不是goto而是标签,随着标签越多产生的错误也就越多,并且标签和goto使得程序难以分析,但是我们java不会出现这种问题,因为标签的场合已经受到限制,就是只能刚好在迭代之前,其实我发现这个特性其实也可以去借鉴试用一下解决一下解决不了的问题,会有意外的收获。加油!!