4.1  return

关键字return有两方面的用途:一方面指定一个方法结束时返回一个值;一方面强行在return位置结束整个方法,如下所示:

 char test(int score) {
     if (score >= 90)
         return 'A';
     if (score >= 80)
         return 'B';
     if (score >= 70)
         return 'C';
     if (score >= 60)
         return 'D';
     else //if (score < 60)
         return 'E';
 }

如上,如果变量score大于或等于90,则在第 3 行结束整个方法,并返回字符'A',如果大于或等于80,则在第5行结束整个方法,并返回字符'B',以此类推,如果score小于60,则在第11行结束整个方法,并返回字符'E'。注意上面的注释,尽管去掉注释后,逻辑上讲得通,但是计算机可不懂人类的这点逻辑,所以当方法是有返回值的时候(视void方法为无返回值的方法),if语句要与else连用。

如果是在返回值为void的方法,return会使方法在当前位置提前结束,如果没有加上return,那么方法的结尾会有隐式的return

void test(int e) {
    if (e == 1)
        return;// 如果e等于1,下面的e++就不会执行了
    e++;
}

4.2  if-else

if-else的语法已经在上一节展示出来了,需要强调的是不可拿数字来做条件判断,whiledo-whilefor循环的条件判断也不可是数字,尽管我们知道C和C++可以用数字来判断truefalse

4.3  迭代(while、do-while、for)

之所以说whiledo-whilefor语句是迭代语句,是因为它们的语句会重复执行,直到起控制作用的布尔表达式得到“假”的结果为止。

while的循环格式如下:

while (Boolean-expression)
  statement

do-while的循环格式如下:

do
  statement
while (Boolean-expression);// 不要忘了分号;

NOTE:whiledo-while唯一的区别就是do-while中的语句至少会执行一次,即便表达式第一次就被计算为false。而在while循环结构中,如果条件第一次就为false,那么其中的语句根本就不会执行。

for循环的格式如下:

for (initialization; Boolean-expression; step)
  statement

其实相当于while循环:

initialization
while (Boolean-expression) {
  statement
  step
}

初始化表达式(initialization)、布尔表达式(Boolean-expression)和步进运算(step)都可以为空。

逗号操作符(非逗号分隔符)

Java里唯一用到逗号操作符的地方就是for循环的控制表达式。在控制表达式的初始化和步进控制部分,可以使用一系列由逗号分隔的语句;而且那些语句均会独立运行

public class CommaOperator {
    public static void main(String[] args) {
        for (int i = 1, j = i + 10; i < 5; i++, j = i * 2) {
            out.println("i = " + i + "j = " + j);
        }
    }
}/*
i = 1 j = 11
i = 2 j = 4
i = 3 j = 6
i = 4 j = 8
*/

for语句中的int定义覆盖了 i 和 j,在初始化部分实际上可以拥有任意数量的具有相同类型的变量定义。在一个控制表达式中,定义多个变量的这种能力只限于for循环适用,在其他任何选择语句中都不能使用这种方式。

可以看到,无论是在初始化还是步进部分,语句都是顺序执行的。此外,初始化部分可以有任意数量的同一类型的定义。

4.4  Foreach语法

foreach访问数组和容器时会显得更加简洁和高效,这里展示访问数组的例子

int[] a = new int[10];
for (int i = 1; i <= 10; i++)
    a[i - 1] = i;
for (int e : a)
    out.println(e);

4.5  break和continue

break用于强行退出当前循环,不执行剩余的迭代;而continue则停止执行当前的迭代,然后退回循环开始初,继续下一次迭代。

for (int i = 0; i < 100; i++) {
    if (i == 74) break;// 若等于74,退出for循环
    if (i % 9 != 0) continue;// 若不是9的整数倍,跳过下面的语句,继续下一次迭代
    out.println(i + " ");
}

println();
int i = 0;
while (true) {
    i++;
    int j = i * 27;
    if (j == 1269) break;// 若j等于1269,退出while循环
    if (i % 10 != 0) continue;// 若i不是10的整数倍,跳过下面的语句,继续下一次迭代
    out.println(i + " ");
}

breakcontinue也可以像goto关键字那样使用标签,不过还是少用好一点。格式如下

label1://标签,注意千万不可在label1和outer-iteration之间写任何代码
outer-iteration {//外部迭代
    inner-iteration {//内部迭代
        // ...
        break;// (1)
        // ...
        continue;// (2)
        // ...
        continue label1;// (3)
        // ...
        break label1;// (4)
    }
}

在(1)中,break中断内部迭代(inner-iteration),回到外部迭代(outer-iteration);

在(2)中,continue跳过下面的语句,回到内部迭代(inner-iteration)的起始处,继续下一次内部迭代(inner-iteration);

在(3)中,continue label1同时中断内部迭代(inner-iteration)和外部迭代(outer-iteration),直接跳转到label1处,随后它实际上是继续迭代过程,但却是从外部迭代(outer-iteration)开始;

在(4)中,break label1将中断所有迭代,并回到label1除,但不再进入迭代了。

下面这个例子展示了带有标签的breakcontinue

int i = 0;
outer:
for (; true;) {
    inner:
    for(; i < 10; i++) {
        println("i = " + i);
        if (i == 2) {
            out.println("continue");
            continue;
        }
        if (i == 3) {
            out.println("break");
            i++;
            break;
        }
        if (i == 7) {
            out.println("continue outer");
            i++;
            continue outer;
        }
        if (i == 8) {
            out.println("break outer");
            break outer;
        }
        for (int k = 0; k < 5; k++) {
            if (k == 3) {
                out.println("continue inner");
                continue inner;
            }
        }
    }
}/*输出结果
i = 0
continue inner
i = 1
continue inner
i = 2
continue
i = 3
break
i = 4
continue inner
i = 5
continue inner
i = 6
continue inner
i = 7
continue outer
i = 8
break outer
*/

同样的规则也适用于while迭代。

要记住的重点是:在Java里需要使用标签的唯一理由无非因为有循环嵌套存在,而且想方便地从多层嵌套中breakcontinue

4.6  switch

switch有时也被划归为一种选择语句。根据整数表达式的值,switch语句可以从一系列代码中选出一段去执行。它的格式如下:

switch (selector) {
    case value1 : statement;break;
    case value2 : statement;break;
    case value3 : statement;break;
    // ...
    default: statement;
}

其中,selector(选择因子)是一个能够产生整型数(或String类型)的表达式,switch能将这个表达式的结果与每个value相比较。若发现相符的,就执行对应的语句(单一的语句或多条语句,其中并不需要括号的)。若没有发现相符的,就执行default语句。关于selector,在jdk1.7以前不能是String类型,而从jdk1.7开始,就既能是整型类型,也能是String类型了。

在上面的定义中,大家会注意到每个case均以一个break结尾,这样可使执行流程跳转到switch主体的结尾。这是构建switch语句的一种传统方式,但break是可选的。若省略break,会继续执行后面的case语句(如果有的话),直到遇到一个break为止。注意最后的default语句没有break,因为执行流程已到了break的跳转目的地,当然,自己完全可以在default语句的末尾放置一个break,尽管这样做没有任何用处。

public class VowelsAndConsonants {
    public static void main(String[] args) {
        Random random = new Random(1972);
        for (int i = 0; i < 5; i++) {
            int c = random.nextInt(26) + 'a';
            out.println((char)c + ", " + c + ": ");

            switch (c) {
                case 'a' :
                case 'e' :
                case 'i' :
                case 'o' :
                case 'u' :  out.println("vowel");
                            break;
                case 'y' :  out.println("Sometimes a vowel");
                            break;
                default:    out.println("Consonant");
            }
        }
    }
}

从这个例子,可以看到case语句可以堆叠在一起,为一段代码形成多重匹配。这时也要注意将break语句置与特定的case的末尾,否则控制流程会简单的往下移,处理后面的case

[Java编程思想-学习笔记]第4章 控制执行流程的更多相关文章

  1. 《Java编程思想》笔记 第四章 控制执行流程

    1.true和false if--else if--else, while, do--while 都使用条件表达式的真假来决定执行路径. Java不允许数字作为真假判断,C和C++可以非0即真. 2. ...

  2. [Java编程思想-学习笔记]第3章 操作符

    3.1  更简单的打印语句 学习编程语言的通许遇到的第一个程序无非打印"Hello, world"了,然而在Java中要写成 System.out.println("He ...

  3. [Java编程思想-学习笔记]第1章 对象导论

    1.1  抽象过程 Java是一门面向对象的语言,它的一个优点在于只针对待解问题抽象,而不用为具体的计算机结构而烦心,这使得Java有完美的移植性,也即Java的口号"Write Once, ...

  4. [Java编程思想-学习笔记]第2章 一切都是对象

    2.1  创建新的数据类型:类 通过第一章掌握了面向对象的理论后,我们知道每个对象必定属于一个类型,那么Java如何创建新的数据类型?如下程序所示: class Circle { // 属性 // 方 ...

  5. Java编程思想 学习笔记4

    四.控制执行流程 1.true和false 所有条件语句都利用条件表达式的真或假来决定执行路径.注意Java不允许我们将一个数字作为布尔值使用. 2.if-else 3.迭代 while.do-whi ...

  6. Java编程思想学习笔记_1(Java内存和垃圾回收)

    1.Java中对象的存储数据的地方: 共有五个不同的地方可以存储数据. 1)寄存器.最快,因为位于处理器的内部,寄存器按需求分配,不能直接控制. 2)堆栈.位于通用RAM,通过堆栈指针可以从处理器那里 ...

  7. Java编程思想 学习笔记1

    一.对象导论 1.抽象过程 Alan Kay曾经总结了第一个成功的面向对象语言.同时也是Java所基于的语言之一的Smalltalk的五个基本特性,这些特性表现了纯粹的面向对象程序设计方式 1)万物皆 ...

  8. Java编程思想学习(五)----第5章:初始化与清理

    随着计算机革命的发展,“不安全”的编程方式已逐渐成为编程代价高昂的主因之一. C++引入了构造嚣(constructor)的概念,这是一个在创建对象时被自动调用的特殊方法.Java中也采用了构造器,并 ...

  9. Java编程思想_笔记_第二章_一切都是对象

    第二章对于知识只是点到,会在以后章节会详细展开. 笔记的侧重会偏向记录自己知识模糊的地方.比如 xxx 很重要很难很实用,但是已经熟练使用就没有记录,而 “使用对象.成员名称来使用成员变量”,较简单而 ...

随机推荐

  1. h5直播开发之旅总结

    前言 关于直播,有很多相关技术文章,这里不多说. 作为前端,我们比较关心我们所需要的. 直播的大致流程: APP端调用摄像头 -> 拍摄视频 -> 实时上传视频 -> 服务器端获取视 ...

  2. 高版本->低版本迁移,低版本客户端连接高版本数据库EXP导出报错EXP-00008,ORA-01455,EXP-00000

    生产环境: 源数据库:RHEL + Oracle 11.2.0.3 目标数据库:HP-UX + Oracle 10.2.0.4   需求:迁移部分表  11.2.0.3-->10.2.0.4,若 ...

  3. Kafka0.10的新特性一览

    原文链接:http://kane-xie.iteye.com/blog/2301197 2016年5月Confluent官方宣布Apache Kafka 0.10正式发布.该版本包含了很多新功能和优化 ...

  4. SQL Server 存储(1/8):理解数据页结构

    我们都很清楚SQL Server用8KB 的页来存储数据,并且在SQL Server里磁盘 I/O 操作在页级执行.也就是说,SQL Server 读取或写入所有数据页.页有不同的类型,像数据页,GA ...

  5. How PhoneGap & Titanium Works

    转载自 http://www.appcelerator.com/blog/2012/05/comparing-titanium-and-phonegap/ How PhoneGap Works As ...

  6. AngularJS中的方法参数的问题

    在使用AngularJS开发的过程中出现了如下的问题,一次贴记录下. 感觉也不能说是AngularJS的语法,应该说是JS里面的处理流程应该就是这样子,我现在想通过前端页面传递值到后端(通过方法传递) ...

  7. 用JAVA日志来写诗

    工欲善其事,必先利其器 很多程序员可能都忘了记录应用程序的行为是一件多么重要的事,当遇到多线程环境下高压力导致的并发bug时,你就能体会到记录log的重要性. 有的人很高兴的就在代码里加上了这么句: ...

  8. GridView的使用

    首先,gridview是封装好的,直接在设计界面使用,基本不需要写代码: 一.绑定数据源 GridView最好与LinQDatasourse配合使用,相匹配绑定数据: 二.样式控制 1.自动套用样式 ...

  9. [WCF编程]10.操作:回调操作

    一.回调操作概述 WCF支持服务将调用返回给它的客户端.在回调期间,许多方面都将颠倒过来:服务将成为客户端,客户端将编程服务.回调操作可以用在各种场景和应用程序中,但在涉及事件或者服务发生时间需要通知 ...

  10. 使用 Visual Studio Online 进行协同开发

    Visual Studio Online(原来的 Team Foundation Service),是项目数据在云中的主页.在我们的云基础架构中只需数分钟便可启动并运行,无需安装或配置任何服务器.设置 ...