Thinking in Java第四章控制执行流程的知识点整理。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/tuzi007a/article/details/96474440

涉及到的关键字,if-else,while,do-while,for,return,break以及选择语句switch,还有类似goto的跳转。
一,if-else
这里else是可选的,有时候不需要写else。
两种描述形式:
1,if(boolean表达式)
{
执行语句;
}
2,if(boolean表达式)
{
执行语句;
}
else
{
执行语句;
}
这里其实还有一种情况,就是else if语句。比如,
if(boolean表达式)
{
执行语句;
}
else if(boolean表达式)
{
执行语句;
}
/* else
{
执行语句;
} * /
注意,多个else if 和多个 if 语句是有区别的。
写多个else if ,只有上面的else if为false的时候,才会进行下一个else if 的语句判断。如果一个else if 一旦执行,其他的else if 都不会执行了。
多个if 语句时,不管上一个if 是true 还是false ,每个if 语句都会执行一次。

二,迭代语句,也叫循环语句,也叫遍历。(怎么舒服就怎么叫吧,反正都是翻译过来的词。)
关键词,while ,do-while,for 。
while 格式,
while(boolean表达式)
{
执行语句;
}
特别的是,
while(true)
{
}
是无限循环语句,因为判断语句的结果一直是true 。
这里书中给了一个代码例子,里面有一句
boolean result = Math.random()<0.99;意思是随机产生的double值与0.99进行比较,然后将布尔型的比较结果赋值给result 。这是首次出现random 。 这里用到了Math库里的static方法random,该方法的作用是产生0和1之间(包括0,但是不包括1)的一个double值。

do-while格式
do
执行语句;
while(boolean表达式)

while和do-while 唯一的区别就是do-while 中的语句至少会执行一次,即便表达式第一次就被计算为false 。而在while循环结构中,如果条件第一次就为false ,那么其中的语句根本就不会执行。实际上,do-while不太常用。
三,for语句
结构
for(初始化表达式;boolean表达式;循环表达)
{
执行语句;
}
以上三个表达式都可以为空,最简单的for 无限循环表达方法:for(;;){} 。
for语句还有一个小知识点,就是逗号操作符,而且只用在for语句中。格式为
for(初始化1,初始化2;布尔1,布尔2;循环表达1,循环表达2)
{
执行语句;
}
就是可以在for 语句中定义多个变量,但是这些变量必须具有相同的类型。要是int都是int,要是long就都是long之类的。
四,foreach语法。 之后章节会讲更多,这里不写了。
五,return
用途:一是指定一个方法返回什么值(在void里面不需要return返回值),二是导致当前的方法退出,并返回那个值。

static int test(int testval,int target)
{
if(testval > target)
{
return 1;
}
}

如果在返回void 方法中没有return 语句,那么在该方法的结尾处会有一个隐式的return,因此在方法中并不是一定要有一个return 。但是,如果一个方法声明它将返回void 之外的其他东西,那么必须确保每一条代码路径都将返回一个值。
六,break 和continue 。
在任何循环语句中,都可以用break 和continue 控制循环的流程。其中 break 用于强行退出循环,不执行循环中剩余的语句。而continue 则停止执行当前的循环,然后退回循环起始处,开始下一次循环。
如,
for(int i=0;i<10;i++)
{
if(i == 4)
break;
if(i%3==0)
continue;
System.out.println(“i=”+i);
}
在这个循环中,i 的值永远不会达到10,因为一旦i 到达4,break 语句就会中断循环。而continue返回到的地方是for 循环语句开头的i++ ,使得i 发生递增。

七,标签
标签的格式
label 1: 后面跟有冒号的标识符。
本节重点:break,continue,break label,continue label 。
使用标签的目的,我们希望在循环语句中嵌套另一个循环或者开关。
这是由于break 和continue 关键词通常只中断当前循环,但如果和标签一起使用,它们就会中断循环,直到标签所在的地方。
①break中断内部循环,回到外部循环;
②continue 使执行点移回内部循环的起始处(i++这里);
③continue label 同时中断内部循环以及外部循环,直接转到label处;随后,它实际上是继续循环过程,但却从外部循环开始;
④break label 也会中断所有循环,并回到label 处,但并不重新进入循环。也就是说,它实际上完全终止了两个循环。
下面有个比较好的示范,
class LabelFor
{
public static void main(String[] args)
{
int i=0;
outer:
for(;true;)
{
inner: //标签。
for(;i<10;i++)
{
System.out.println(“i=”+i);
if(i == 2)
{
System.out.println(“continue”);
continue;
}
if(i==3)
{
System.out.println(“break”);
i++;

				break;
			}
			if(i==7)
			{
				System.out.println("continue outer");
				i++;
				
				continue outer;
			}
			if(i==8)
			{
				System.out.println("break outer");
				break outer;
			}
			for(int k=0;k<5;k++)
			{
				if(k == 3)
				{
					System.out.println("continue inner");
					continue inner;
				}
			}
		}
			
	}
}

}
步骤解析:
1,i = 0,进入for(;true;){}这个无限循环里。这里有个inner:标签。
2,然后继续往里,进入for(;i<10;i++) 这个循环里。
3,遇到输出语句,对i 值进行输出。println(“i=”+i);
4,i=0,继续往下走,发现下面几个if()语句都是fault结果,所以进入第三个循环语句里。for(int k=0;k<5;k++){}
5,k值开始循环,k=0,1,2都没有对应的输出语句,当k=3时,有输出语句,所以输出continue inner 。
6,继续往下走。碰到continue inner; 根据它的用法,立刻终止当前的循环,回到inner:标签处。
7,inner: //标签。
for(;i<10;i++){} 。 回到这里,开始进入到for循环的i++ 表达式,对i 自增。 这时,i=1.
8,继续往下执行,同步骤3和4。
9,i=2,所以if(i == 2) 这个结果是true,执行输出语句。输出continue 。
10,再往下,执行continue语句。终止当前循环,回档这个循环的初始位置,即i++这里。对i 进行自增。然后i=3 .
11,i=3,那么 if ( i == 3)这个语句就判断为true,执行输出语句,输出break 。然后执行i++;自增语句。
再往下,遇到了break,终止当前循环,回到了外部循环for(;true;){}。
12,然后是i=4,5,6的循环操作,没什么特别之处。同步骤5和6 .
13,这时到了i=7,那么if( i==7)这个语句判断为true 。执行输出语句,输出continue outer 。然后自增 i++ 。i的值变为8 .
14,再往下,遇到语句continue outer; 跳到标签outer:处。也就是这里。 outer:
for(;true;) 最外部的循环。
15,i=8,那么if( i == 8)这个语句就判断为true,执行输出语句,输出break outer 。
16,再往下走,遇到break outer;这个语句。 意思是终止outer:标签下面的所有循环,回到outer外面的一个循环。但是outer:标签外面没有循环语句了,所以,这里就中断了所有的循环。 程序不再继续执行。 结束。
以上就是标签在for循环中的用法。同样的,标签也在while中适用。规则相同。
八,switch语句。选择语句。
格式:
switch(能产生 int或者char类型的整数值 的表达式)
{
case 。。的整数值1:执行语句;break;
case 。。的整数值2:执行语句;break;
case 。。的整数值3:执行语句;break;

default:执行语句;
}
用写好的简单代码来做示范。
class Switch4_8
{
public static void main(String[] args)
{
int i=0;
for(;i<5;i++)
{
switch(i)
{
case 3:System.out.println(“i=”+i);break;
case 2: System.out.println(“i=”+i); break;
case 0: System.out.println(“i=”+i);break;
default: System.out.println(“i=”+i);
}
}
}
}
细节点:
1,case 后面的整数值不能相同。如果一样了,会报错。
2,执行语句和break 都可以不写。
3,switch中表达式产生的整数值,会跟下面每一个case 里的值进行比较,不管有没有break 。
4,如果发现产生的值和case 里的值是相符的,就执行对应的语句;如果没有相符的,就执行default语句。
5,break相当于上下case的隔断,写break和不写break 是有区别的。
写break,如果执行了这个case的语句,就和下个case隔断了,就不会执行下个case里面的执行语句。 如果不写break,就是上下两个case的执行语句没有被隔断。 如果执行了这个case的执行语句,那么不管下个case的值是否相符,都会用这个case的值 去执行下一个case的执行语句。

书中给一个特别的示例,随机生成字母,创建对象时,
Random r = new Random(47);
for(int i=0;i<100;i++)
{
int c = r.nextInt(26)+‘a’;

}
Random.nextInt(26)会产生0到26之间的要给值。包括0,不包括26.
注意上面有个47,关于这个47,有没有写这个47,差别还是挺大的。
具体可以看 https://blog.csdn.net/zhang41228/article/details/77069734 这篇博文,
还有关于 Math.random() 和Random()的区别,如下面这个博文。 https://blog.csdn.net/yezhuAndroid/article/details/78647984 。反正我看着写的还不错的,至少我这个小白算是看懂了。感谢两位博主。
第四章整理到这里就结束了。
以上。

猜你喜欢

转载自blog.csdn.net/tuzi007a/article/details/96474440
今日推荐