Java SE 是什么,包括哪些内容(七)?
本文内容参考自Java8标准
本文将包括所有Java中有关程序流程控制的内容,如果有读者发现遗漏或者是错误,请及时给我留言,我将及时改正,谢谢!
程序流程控制可以简单用一句话来开始:如果是这种情况,就走A流程,如果是那种情况就是走B流程…所以,一个完整的程序中会有很多流程,因为,一个完整的程序需要包括很多种情况,并且程序后期的维护也是为了补充新出现但未涉及到的流程。
Java使用了C的所有流程控制语句,大多数过程型编程语言都具有某些形式的控制语句,他们通常在所有语言中是及其类似的,在Java中,涉及的关键字包括:if…else,while,do…while,for,return,continue,break,switch。
Java并不支持goto语句(该语句引起很多的反对意见,但它仍是解决某些特殊问题最便利的方法,最后我会详细解释,为什么goto臭名昭著),但是在Java中,仍然可以进行像goto那样的跳转,但是比起典型的goto,有了很多的限制。
重要的事情说三遍:个人觉得非常有必要花一些时间去深入理解流程控制语句!因为,它绝对是你看懂别人代码的基础!
重要的事情说三遍:个人觉得非常有必要花一些时间去深入理解流程控制语句!因为,它绝对是你看懂别人代码的基础!
重要的事情说三遍:个人觉得非常有必要花一些时间去深入理解流程控制语句!因为,它绝对是你看懂别人代码的基础!
1、非常重要的两个关键字:true,false
除了switch语句,其他的条件语句都利用条件表达式的真假来决定执行路径,这里有一个条件表达式的例子:a==b;它用条件操作符"=="来判断a值是否等于b值,该表达式返回true或者false(如果a与b相等,就是true,如果不等,就是false)。
之前博文介绍的所有关系操作符,都可以拿来构造条件语句!
PS:Java不允许我们直接将一个数字作为布尔值来使用,但是这在C和C++中是允许的(在这些语言里,"真"是非零,"假"是零),如果想在一个布尔测试中使用非布尔值,需要将这个非布尔值转换为一个布尔表达式,例如:if(a!=0)
2、if…else
if…else语句是控制程序流程的最基本的形式,其中else是可选的(可以只有if,而没有else),所以,可按下述两种形式来使用if:
⑴、第一种形式
// if...
if(boolean--expression)
{
statement;
}
⑵、第二种形式
// if...else
if(boolean--expression)
{
statement;
}else{
statement;
}
布尔表达式"boolean–expression"必须产生一个布尔结果,statement是指用分号结尾的简单语句,或封闭在**{ }**内的一组简单语句。
示例1:
// if...else举例
public class One {
//方法LCKZ,带有一个int类型的参数i
public void LCKZ(int i) {
//如果i的值为2,就在控制台打印"2"。
if(i==2) {
System.out.println("2");
}
//注意,这句代码只要调用了方法LCKZ(int i),就一定会执行!
System.out.println("没有进入if语句!");
}
public static void main(String[] args) {
//创建类One的对象
One o = new One();
//调用方法LCKZ(int i)
o.LCKZ(1);
//结果:
//仅在控制台输出了:没有进入if语句!
}
}
示例2:
// if...else举例
public class One {
//方法LCKZ,带有一个int类型的参数i
public void LCKZ(int i) {
//如果i的值为2,就在控制台打印"2"。
if(i==2) {
System.out.println("2");
}
//注意,这句代码只要调用了方法LCKZ(int i),就一定会执行!
System.out.println("没有进入if语句!");
}
public static void main(String[] args) {
//创建类One的对象
One o = new One();
//调用方法LCKZ(int i)
o.LCKZ(2);
//结果:
//既输出了2,又输出了:没有进入if语句!
}
}
现在,我们发现了一个问题,只要调用了方法LCKZ(int i),结果一定会出现"没有进入if语句",那么,如何控制一旦进入了if语句就不再输出它了呢?这个时候,就得用上else了。很明显,if和else代表了两个流程。
示例3:
// if...else举例
public class One {
//方法LCKZ,带有一个int类型的参数i
public void LCKZ(int i) {
//如果i的值为2,就在控制台打印"2"。
if(i==2) {
System.out.println("2");
}
//注意,增加了else,这句代码就是另外一个流程了。
//只要没有进入if,就会执行else,如果执行了if,
//else就不再被执行!
else{
System.out.println("没有进入if语句!");
}
}
public static void main(String[] args) {
//创建类One的对象
One o = new One();
//调用方法LCKZ(int i)
o.LCKZ(2);
//结果:
//既输出了2,又输出了:没有进入if语句!
}
}
在熟悉了if…else的基本使用之后,还有两个问题需要明确。
①、多个if…else连接,也可以称为是if…else的终极版本,出现这种情况是因为你确实有这么多的条件需要判断!
// if...else的终极版本
if(boolean--expression)
{
statement;
}else if(boolean--expression){
statement;
}else if(boolean--expression){
statement;
}else if(boolean--expression){
statement;
}else if(boolean--expression){
statement;
//这里还可以有无数的else if(boolean--expression)
//鉴于篇幅,我就不再加了。
}else{
statement;
}
//有个问题需要特别注意,"else if"并不是新的关键字,只是在一个if...else
//结束之后紧接这另一个if...else的开始。
②、如果确实需要,你可以这么做—在if…else里面,你还需要继续判断,这就是if…else的嵌套了,甚至嵌套一个终极版本也是可以的。
// if...else的终极版本
if(boolean--expression)
{
if(boolean--expression){
statement;
}else if(boolean--expression){
statement;
}else if(boolean--expression){
statement;
}else if(boolean--expression){
statement;
//这里还可以有无数的else if(boolean--expression)
//鉴于篇幅,我就不再加了。
}else{
statement;
}
}else {
if(boolean--expression){
statement;
}else{
statement;
}
}
//如果你觉得很复杂,那么请你将所有的{ }上下对齐,再仔细看看,就很有帮助,
//至少你能看出主体的框架结构。
//这里就不再举实际的例子了,有兴趣,自己可以试一试。
注意,虽然{ }里面的statement只有一句简单语句的时候,{ }可以省略,但是强烈不建议这么做,不管在什么情况下,都必须写上{ }!
3、迭代(循环)
有三种关于迭代的选择:while,do…while,for。
while,do…while,for 用来控制循环,有时将它们划分为迭代语句,
它们都有**{ },一旦用到了它们,那么{ }** 里面的所有内容都将不断地执行,直到它们的布尔表达式的结果为"假"(或者说不成立)。
⑴、while循环的表达式:
// while循环表达式
while(boolean-expresion){
statement;
}
这里说三句话:如果理解了,那么while循环你们就掌握了90%,并且有利于去阅读其他人的代码:
①、while循环是一个整体,要么执行,要么不执行。
②、while循环的boolean-expresion结果成立(为真)开始执行。
③、while循环的boolean-expresion结果不成立(为假)停止执行。
如图:
每次while循环都是先判断,后执行循环,先判断,后执行循环,判断的次数总是比执行循环的次数多一次,因为最后一次判断不成立,循环不再执行。
代码示例:
// while循环代码示例
public class One {
//测试方法Test()
public void Test() {
//声明变量i;
int i = 1;
//while循环,如果i<6停止循环。
while(i<6) {
//循环一次,输出i的值。
System.out.println(i);
//循环一次,i自增1。如果i不自增的话。
//i永远是1,永远小于6。那么这个while循环就停不下来。
//如果一个循环停不下来,是比较麻烦的bug。
i++;
}
}
public static void main(String[] args) {
One o = new One();
o.Test();
}
}
//你们可以猜一猜,最后的执行结果是什么?
实际代码示例:
⑵、do…while循环的表达式:
// do...while循环表达式
do{
statement;
}while(boolean-expresion);
这里说三句话:如果理解了,那么do…while循环你们就掌握了90%,并且有利于去阅读其他人的代码:
①、do…while循环是一个整体,要么执行,要么不执行。
②、先执行循环体,也就是do后面的{ }里面的内容,再判断boolean-expression表达式是否成立。
③、do…while的执行次数总是和判断次数一样多,因为,每次总是先执行就立马进行判断,如果表达式为假,循环体不再执行。
如图:
"成立"下面这条yes的箭头应该直接指向"直接执行do{ }里面的内容"的这个框,但是CSDN提供的这个图确实有BUG,我尝试了无数次都实现不了,结果只能放弃!
每次do…while循环都是先执行,后判断,先执行,后判断,判断的次数总是和执行循环的次数一样多(因为只要执行完后立马就进行判断)。
代码示例:
// while循环代码示例
public class One {
//测试方法Test()
public void Test() {
//声明变量i;
int i = 1;
//while循环,如果i<6停止循环。
do {
//循环一次,输出i的值。
System.out.println(i);
//循环一次,i自增1。如果i不自增的话。
//i永远是1,永远小于6。那么这个while循环就停不下来。
//如果一个循环停不下来,是比较麻烦的bug。
i++;
}while(i<6);
}
public static void main(String[] args) {
One o = new One();
o.Test();
}
}
//你们可以猜一猜,最后的执行结果是什么?
结果和while循环是一致的。
在实际的编程中,while是使用非常频繁的,但是do…while几乎不怎么使用,你可以根据自己的实际需要进行选择!
最后再强调一遍:如果while循环的条件表达式结果为false,整个while循环根本不会执行,但是do…while循环至少会执行一次,因为它是先执行再判断!
最后,还有一种特殊的情况需要强调一下:
// while无限循环
while(true){
statement;
}
//do...while无限循环
do{
statement;
}while(true);
如果while和do…while的条件表达式里面直接是一个"true",那么这将是一个无限循环,程序到这里将一直循环下去,连地球毁灭都阻止不了,这种情况慎用,使用它的最典型的应用就是聊天系统,利用一个无限循环时刻检测对方是否有连接过来,如果使用了无限循环,循环内部一定会有一个跳出循环的条件判断,一旦满足,立即终止循环,继续执行循环后的程序代码。
⑶、for循环的表达式:for循环常用于执行"计数"!
for循环有固定的格式,我们必须先了解它固定的格式,才能知道如何使用。
// for循环的固定格式
//initialization代表了一个初始化值,Boolean-expression代表一个
//循环终止条件判断,step是一个步进。
for(initialization;Boolean-expression;step){
statement;
}
进入for循环,首先执行初始化表达式,然后再执行条件表达式,如果满足条件表达式,则进入循环,循环后,再进入步进。步进后,再次执行条件表达式,如果满足条件表达式,则继续循环,直到条件表达式的结果为false。
最重要的:每次循环之前会执行条件表达式,结果为true,进入循环,结果为false,退出循环,每次循环结束后,会执行步进表达式!
for循环典型的应用环境是:从一开始,你就知道需要循环多少次!
①、首先,你知道它从哪里开始。
②、其次,你知道它到哪里结束。
③、最后,你需要的循环间隔是多少。
以上三点的开始,结束,间隔都是指数值!数值!数值!
如果以上内容,你还是看不懂,那么,我再通过举例说明:
举例1:
有一个数组{0,1,2,,3,4,5,6,7,8,9},请取出数组中的每一个值,
并打印出来。
思路1: 开始是从第一个开始,结束是最后一个(也就是数组长度),间隔是1。所以for循环的代码:
// for循环的实际举例
//首先,从第一个开始,所以需要一个变量
//i,初始化为0(从0开始是因为数组的下标从0开始),其次,循环结束的条件是数组长度,
//也就是10,所以是i<10就直接退出。
//步进指的是,结束当前值,继续下一个值。
//如果没有步进,for循环也是一个无限循环,
//因为,如果没有步进,i值永远是0,i<10永远成立!
for(int i=0;i<10;i++){
//首先执行i=0操作,再执行i<10,显然成立,立即进入循环体,所以你在
//首次进入for循环的时候,直接打印i的值,结果为0,,说明未执行i++
//步进表达式。
//首次循环执行完毕后,立即进入步进表达式(i++),
//接着再进入条件表达式,如果满足,立即进入循环。
//直到条件表达式结果为false,立即退出for循环。
//总结:初始化表达式只执行1次。之后一直在步进以及条件表达式中循环
...
}
思路2: 开始是从最后一个开始(也就是数组长度),结束是第一个,间隔是1。所以for循环的代码:
// for循环的实际举例
//首先,从最后一个开始,所以需要一个变量
//i,初始化为10(数组的长度),其次,循环结束的条件是不能小于第一个,也就是0(数组下标)
//所以是i>0就直接退出。
//步进指的是,结束当前值,继续下一个值。
//如果没有步进,for循环也是一个无限循环,
//因为,如果没有步进,i值永远是10,i>0永远成立!
for(int i=10;i>0;i--){
...
}
以上两个例子,一个是按从头至尾循环,一个是逆向循环,for循环的固定格式的魅丽就在于你如何设置开始,如何设置条件表达式,如何设置步进。
如果以上举例需要每一个奇数位值或者是偶数位值,那么步进就是2(也就是间隔是2)!
最后,还有两种特殊的情况需要强调一下:
①、for循环可以有多个初始化表达式,多个步进表达式,但是只能有一个条件表达式(如果是两个条件表达式,那么它们的性质是一样的,本质上还是一个!):
在for循环的初始化部分,实际上可以拥有任意数量的相同类型的变量定义!定义多个变量的这种能力仅限于for循环使用。其他任何循环中都不能这样使用!
// for循环及其复杂的情况
for(int i=0;j=i+10;i<5;i++,j=i*2){
statement;
}
②、for循环的初始表达式、条件表达式、步进表达式都可以为空:
// 最精简的for循环
//初始表达式、条件表达式、步进表达式都可空,但是";"是不能省略的!
for(;;){
//如果是这种形式,那么这个for循环就是一个无限循环。
}
⑷、foreach循环
这里暂时不适合讲解foreach循环,因为它不是一种通用的循环方式,它仅仅是Java SE5版本针对数组和容器而特别増加的便捷功能!后面提到数组和容器的时候会描述foreach循环的使用场景及方式。
第一部分的程序流程控制就是以上内容,下一遍博文将重点描述有关流程控制的三个关键字的使用:retuen,break,continue
PS:时间有限,有关Java SE的内容会持续更新!今天就先写这么多,如果有疑问或者有兴趣,可以加QQ:2649160693,并注明CSDN,我会就博文中有疑义的问题做出解答。同时希望博文中不正确的地方各位加以指正!