Java开发笔记(十七)各得其所的多路分支
前面提到条件语句的标准格式为“if (条件) { /* 条件成立时的操作代码 */ } else { /* 条件不成立时的操作代码 */ }”,乍看之下仿佛只有两个分支,一个是条件成立时的分支,另一个是条件不成立时的分支。很明显仅仅两个分支是不能满足复杂的业务需求的,自然Java代码也不会这么傻瓜到固步自封,为此else分支还允许嫁接别的if条件,形如“if (条件一) { } else if (条件二) { } else if (条件三) { } else { }”这样,不管来几个条件分支,都能通过“else if”加以判断和处理。像之前的猜谜游戏,输入数字1时打印凉风有信的谜底,输入数字2时打印秋月无边的谜底,现在规定输入其它数字要打印“按键有误”的提示,此时一共存在三个条件分支,往原来的if/else语句添加一个“else if”即可实现三个分支。
下面便是改写成三个分支之后的代码例子:
System.out.println("凉风有信,秋月无边。打二字");
System.out.println("获取“凉风有信”的谜底请按1,获取“秋月无边”的谜底请按2");
Scanner scan = new Scanner(System.in); // 从控制台接收输入文本
/* nextLine方法表示接收一行文字,以回车键结尾 */
int seq = scan.nextInt();
if (seq == 1) { // 条件式子1为真时,进入第一个if分支处理
System.out.println("凉风有信的谜底是“讽”");
} else if (seq == 2) { // 否则的话,继续判断条件式子2为真时,进入第二个if分支处理
System.out.println("秋月无边的谜底是“二”");
} else { // 否则(前面的判断条件都不满足),进入else分支处理
System.out.println("您的按键有误");
}
可要是分支数量多了起来,岂不是得写一样多的“if else”?这种做法虽然可行,但毕竟大费周折,条理也不够清晰。故而早期的设计师构造了“swicth-case”语句,也被称作是多路分支结构,在该控制流程之中,对每个分支都指定了一个数值把关,只有设定的变量符合数值要求,才能进到相应的分支处理。这样做的好处是,方便编译器在底层进行优化,既可利用二分查找法加快寻找速度,又可采取地址映射直接找到指定分支。兼容并蓄的Java自然继承了有利于调优的“swicth-case”,多路分支语句除了swicth和case,还额外增加了break和default两个关键字。break的作用是跳出整个多路分支,不再执行本分支及其余分支的代码;default的作用相当于else,所有不满足任何已知条件的数值,都进入到default这个默认分支来处理。
仍以猜谜游戏为例,使用“swicth-case”改写后的多路分支代码如下所示:
// switch允许判断某个变量的多个取值,并分别进行单独处理
switch (seq) {
case 1: // seq值为1时进入该分支
System.out.println("凉风有信的谜底是“讽”");
break; // 跳出多路分支。即跳到switch分支的右花括号之后
case 2: // seq值为2时进入该分支
System.out.println("秋月无边的谜底是“二”");
break; // 跳出多路分支。即跳到switch分支的右花括号之后
default: // seq值为其它时进入该分支
System.out.println("您的按键有误");
break; // 跳出多路分支。即跳到switch分支的右花括号之后
}
System.out.println("猜谜结束");
多路分支固然好用,但要特别注意以下几点:
1、每个case分支末尾务必要加上break语句,否则即使该分支走完了也不会跳出多路分支,而是继续执行该分支的后面一个分支代码,显然这并非程序员的本意。
2、多路分支只能判断整型、字符串、枚举这三种类型的变量,无法判断布尔、浮点、双精度等其它类型的变量。
3、case语句后面的数值,只能用来进行相等判断,不能开展大于、小于等其它关系运算。
Java开发笔记(十七)各得其所的多路分支的更多相关文章
- Java开发笔记(七十七)使用Optional规避空指针异常
前面在介绍清单用法的时候,讲到了既能使用for循环遍历清单,也能通过stream流式加工清单.譬如从一个苹果清单中挑选出红苹果清单,采取for循环和流式处理都可以实现.下面是通过for循环挑出红苹果清 ...
- Java开发笔记(八十七)随机访问文件的读写
前面介绍了字符流读写文件的两种方式,包括文件字符流和缓存字符流,但是它们的写操作都存在一个问题:不管是write方法还是append方法,都只能从文件开头写入,而不能追加到文件末尾或者在文件中间某个位 ...
- Java开发笔记(二十七)数值包装类型
方法的出现缘起优化代码结构,但它的意义并不局限于此,正因为有了方法定义,编程语言才更像一门能解决实际问题的工具,而不仅仅是只能用于加减乘除的计算器.在数学的发展过程中,为了表示四则运算,人们创造了加减 ...
- Java开发笔记(三十七)利用正则串分割字符串
前面介绍了处理字符串的常用方法,还有一种分割字符串的场景也很常见,也就是按照某个规则将字符串切割为若干子串.分割规则通常是指定某个分隔符,根据字符串内部的分隔符将字符串进行分割,例如逗号.空格等等都可 ...
- Java开发笔记(四十七)关键字this的用法
前面介绍了类的基本定义,包括成员属性.成员方法.构造方法几个组成要素,可谓是具备了类的完整封装形态.不过在进行下一阶段的学习之前,有必要梳理一下前述的类定义代码,看看是否存在哪些需要优化的地方.首先观 ...
- Java开发笔记(五十七)因抽象方法而产生的抽象类
前面介绍了类的常见用法,令人感叹面向对象的强大,几乎日常生活中的所有事物,都可以抽象成Java的基类及其子类.然而抽象操作也有副作用,就是某个抽象而来的行为可能是不确定的,比如半夜鸡叫,如果是公鸡则必 ...
- Java开发笔记(六十七)清单:ArrayList和LinkedList
前面介绍了集合与映射两类容器,它们的共同特点是每个元素都是唯一的,并且采用二叉树方式的类型还自带有序性.然而这两个特点也存在弊端:其一,为啥内部元素必须是唯一的呢?像手机店卖出了两部Mate20,虽然 ...
- Java开发笔记(九十七)利用Runnable启动线程
前面介绍了线程的基本用法,按理说足够一般的场合使用了,只是每次开辟新线程,都得单独定义专门的线程类,着实开销不小.注意到新线程内部真正需要开发者重写的仅有run方法,其实就是一段代码块,分线程启动之后 ...
- Java开发笔记(一百四十七)通过JDBC管理数据库
前面介绍了如何通过JDBC获取数据库连接,可是Connection对象不能直接执行SQL语句,需要引入Statement报告对象才能操作SQL.Statement对象由Connection的creat ...
- Java开发笔记(一百一十七)AWT窗口
前面介绍的所有Java代码,都只能通过日志观察运行情况,就算编译成class文件,也必须在命令行下面运行,这样的程序无疑只能给开发者做调试用,不能拿给一般人使用.因为普通用户早已习惯在窗口界面上操作, ...
随机推荐
- javaweb聊天室源码免费
效果:可擴展源碼,免費技術指導,電話13956301647 链接:https://pan.baidu.com/s/1FWV8DNWacGaEpAQEsWsNaw 提取码:b6gf
- Servlet 监听器Listner
定义: 专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动. Servlet 规范为每种事件监听器都定义了相应的接口,它用于监听 ...
- layui table分页 page为false时,limit问题
问题描述:table数据表格page设为false时,limit为默认设置10 解决办法:limit设为 Number.MAX_VALUE 加载全部数据 实例: var table = layui.t ...
- Edge Intelligence: On-Demand Deep Learning Model Co-Inference with Device-Edge Synergy
边缘智能:按需深度学习模型和设备边缘协同的共同推理 本文为SIGCOMM 2018 Workshop (Mobile Edge Communications, MECOMM)论文. 笔者翻译了该论文. ...
- Java作业十二(2017-11-13)
/*继承与抽象类*/ package com.baidu.www; abstract class Person { private String name; private int age; publ ...
- 【RL-TCPnet网络教程】第27章 DNS域名系统基础知识
第27章 DNS域名系统基础知识 本章节为大家讲解DNS(Domain Name System,域名系统),通过前面章节对TCP和UDP的学习,需要大家对DNS也有个基础的认识. (本章的知 ...
- Spring Cloud 微服务架构的五脏六腑,统统晒一晒!
Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 注:Spring Boot 简单理解就是简化 Spring 项目的搭建.配置.组 ...
- 吴恩达机器学习笔记54-开发与评价一个异常检测系统及其与监督学习的对比(Developing and Evaluating an Anomaly Detection System and the Comparison to Supervised Learning)
一.开发与评价一个异常检测系统 异常检测算法是一个非监督学习算法,意味着我们无法根据结果变量
- HttpSession的API
//获取Session对象request.getSession()request.getSession(boolean create)//获取SessionIdgetId()//获取当前session ...
- 当初要是看了这篇,React高阶组件早会了
当初要是看了这篇,React高阶组件早会了. 概况: 什么是高阶组件? 高阶部件是一种用于复用组件逻辑的高级技术,它并不是 React API的一部分,而是从React 演化而来的一种模式. 具体地说 ...