五、Java基础---------if else、switch总结
在前几篇博客中主要是以笔者遇到的一些典型的题目为例子而展开的讨论,接下来几篇将是以知识点的结构进行讲述。本文主要是讲述if ()else 、if() else if()、switch() case 的一些注意细节。
一、if else结构
if语句使用表达式或者boolean值作为分支条件进行分支控制。If语句有如下三种形式。
第一种形式
if(logic expression)
{
stattement...
}
第二种形式
if(logic expression)
{
stattement...
}
else
{
stattement...
}
第三种形式
if(logic expression)
{
stattement...
}
else if(logic expression)
{
stattement...
}
...个或者多个else if语句
else //最后一个else也可以省略
{
stattement...
}
在上面三种形式中if语句之后的括号只能是一个逻辑表达式,即这个表达式的返回值只能说true或者false。第二种形式和第三种是相通的,如果第三种形式不出现else if()就变成了第二种形式。
因为if 与else是一个整体,所以在if 与else之间不能有其他多余的语句,例如下面的形式
int a=0;
if(a==0)
{
a=1;
}
int c=a;//报错
else
{
a=2;
}
如果if else语句后面只有一条语句那么可以省略大括号,如下面的形式:
int a=0;
if(a==0)
a=1;//只有一条语句所以省略花括号
else//后面有多条语句,所以花括号不可以省略
{
a=2;
System.out.print(a);
}
在使用if语句时还有一个很容易犯的逻辑错误,但是这个逻辑使用不属于语法错误。如下程序展示:
int age = 45;
if (age > 20)
{
System.out.println("青年人");
}
else if (age > 40)
{
System.out.println("中年人");
}
else if (age > 60)
{
System.out.println("老年人");
}
表面上看起来,上面的程序没有任何问题:人的年龄大于20岁的是年轻人,年龄大于40岁的是中年人,大于60的是老年人。但是运行上面的程序,发现打印的结果是:年轻人,实际上我们希望45岁应该判断为中年人—显然出现了一个问题。
对于任何的if else语句,表面上看起来else后面没有任何条件,或者else if后面只有一个条件—但是这不是真相:因为else隐含的语义是"否则",也就是else本身就是一个条件!else隐含的意识是与前面的条件取反。因此上面的代码实际上可以修改为:
int age = 45;
if (age > 20)
{
System.out.println("青年人");
}
//在原本的if条件中增加了else的隐含条件
else if (age > 40 && !(age > 20))
{
System.out.println("中年人");
}
//在原本的if条件中增加了else的隐含条件
else if (age > 60 && !(age > 20) && !(age > 40 && !(age > 20)))
{
System.out.println("老年人");
}
此时就比较容易看出为什么发生上面的错误了。对于age > 40 && !(age > 20)又可以改写为age > 40 &&age<=20,这样永远也不会发生。对于age > 60 && !(age > 20) && !(age > 40 && !(age > 20))更不可能发生了,因此程序永远都不会判断中年人和老年人的情况。为了达到正确的目的,我们把程序改写为以下的形式:
int age = 45;
if (age > 60)
{
System.out.println("老年人");
}
else if (age > 40)
{
System.out.println("中年人");
}
else if (age > 20)
{
System.out.println("青年人");
}
运行程序得到正确结果。实际上上面的程序等同于下面的代码:
int age = 45;
if (age > 60)
{
System.out.println("老年人");
}
//在原本的if条件中增加了else的隐含条件
else if (age > 40 && !(age >60))
{
System.out.println("中年人");
}
//在原本的if条件中增加了else的隐含条件
else if (age > 20 && !(age > 60) && !(age > 40 && !(age >60)))
{
System.out.println("青年人");
}
上面程序的判断逻辑即转化为如下的三种形式:
age 大于60 判断为老年人
age 大于40且小于60 判断为中年人
age 大于20且小于40 判断为青年人
上面的判断逻辑才是我们所希望的,因此当使用if else 语句进流程控制时,一定不要忽略lelse 所隐含的条件。
如果每次都去计算if条件和else条件的交集也是意见繁琐的事因此引入了switch case结构。
二、switch case结构
正如上节所提及的,当if else语句过多时,处理起来会相当繁琐,而switch case的出现弥补了这一缺陷。
switch 语句由一个控制表达式和多个case标签组成,和if语句不同的是,switch语句后面的控制表达式的数据类型只能是byte、short、char、int四个数据类型和枚举类型,不能是boolean类型(注意的是再jdk 1.7中新增了String类型)。
switch 语句case标签后面紧跟一个代码块,case标签作为这个代码块的表示,语法格式如下
switch(expression)
{
case condition1: statement(s);break;
case condition2: statement(s);break;
case condition3: statement(s);break;
case condition4: statement(s);break;
...
default:statement(s);
}
执行原则是判断 expression 与case中条件进行匹配,当匹配成功则执行当前标签内容,如全部匹配失败则执行default代码块。示例如下:
char score = 'C';
//执行swicth分支语句
switch (score)
{
case 'A':
System.out.println("优秀.");
break;
case 'B':
System.out.println("良好.");
break;
case 'C':
System.out.println("中");
break;
case 'D':
System.out.println("及格");
break;
case 'F':
System.out.println("不及格");
break;
default:
System.out.println("成绩输入错误");
}
运行上面的程序,看到输出"中",这个结果完全正确,字符表达式score的值为'C',对应结果为'中'。在case标签后的每个代码块后面都一个break语句,其作用是当匹配成功后执行完业务逻辑后终止switch。如果将break语句注释,会造成一个很严重的错误。错误输出为:
中
及格
不及格
成绩输入错误
这个运行结果看起来很难去理解,其实正是switch流程结构所决定的。Switch语句会先求出express表达式的值,然后那这个表达式和case标签进行比较,一旦遇到相等的值程序就开始执行case标签之后的代码而不再去匹配后面的case,除非遇到break才会结束。
到这里if else 、switch知识点总结完毕,另外补充两点
1、处理if else 时尽量先处理范围更小的情况
2、在jdk1.7 中 switch 运行使用String类型作为匹配条件。
五、Java基础---------if else、switch总结的更多相关文章
- Java基础四(switch、数组、)
1.流程控制语句switch2.数组3.随机点名器案例 ###01switch语句解构 * A:switch语句解构 * a:switch只能针对某个表达式的值作出判断,从而决定程序执行哪一段代码. ...
- Java基础学习笔记五 Java基础语法之面向对象
面向对象 理解什么是面向过程.面向对象 面向过程与面向对象都是我们编程中,编写程序的一种思维方式.面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.例如:公司打扫卫生( ...
- 8.Java基础_if-else和switch选择语句
/* 选择语句(基本与C++相同) if-else语句: 格式一: if(关系式){ 语句体; } 格式二: if(关系式){ 语句体; } else{ 语句体; } 格式三: if(关系式){ 语句 ...
- Java基础学习笔记总结
Java基础学习笔记一 Java介绍 Java基础学习笔记二 Java基础语法之变量.数据类型 Java基础学习笔记三 Java基础语法之流程控制语句.循环 Java基础学习笔记四 Java基础语法之 ...
- Java基础知识陷阱系列
Java基础知识陷阱系列 今天抽空把Java基础知识陷阱有关的文章汇总于此,便于大家查看. Java基础知识陷阱(一) Java基础知识陷阱(二) Java基础知识陷阱(三) Java基础知识陷阱(四 ...
- 大数据学习--day04(选择结构、循环结构、大数据java基础面试题)
选择结构.循环结构.大数据java基础面试题 switch: 注意: byte short int char String(jdk1.7支持) 不能是 long float double boolea ...
- java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别
java基础解析系列(五)---HashMap并发下的问题以及HashTable和CurrentHashMap的区别 目录 java基础解析系列(一)---String.StringBuffer.St ...
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
JAVA基础再回首(二十五)--Lock锁的使用.死锁问题.多线程生产者和消费者.线程池.匿名内部类使用多线程.定时器.面试题 版权声明:转载必须注明本文转自程序猿杜鹏程的博客:http://blog ...
- Java基础五(方法)
今日内容介绍1.方法基础知识2.方法高级内容3.方法案例 ###01方法的概述 * A: 为什么要有方法 * 提高代码的复用性 * B: 什么是方法 * 完成特定功能的代码块. ###02方法的定义格 ...
- JAVA基础——Switch条件语句
JAVA基础——switch 条件语句 switch语句结构: switch(表达式){ case值1: 语句体1: break: case值2: 语句体2: break: case值3: 语句体3: ...
随机推荐
- [LeetCode]题解(python):100 Same Tree
题目来源 https://leetcode.com/problems/same-tree/ Given two binary trees, write a function to check if t ...
- Python PIL ImageDraw 和ImageFont模块学习
ImageDraw 新建一个空白图片为本文作示例,新建空白文件的方法 见Image模块,Image.new: import Image blank = Image.new("RGB" ...
- JMeter学习-009-JMeter 后置处理器实例之 - 正则表达式提取器(二)多参数获取
前文简述了通过后置处理器 - 正则表达式提取器 获取 HTTP请求 响应结果中的特定数据,未看过的亲,敬请参阅 JMeter学习-008-JMeter 后置处理器实例之 - 正则表达式提取器(一). ...
- PySe-003-Se-WebDriver 启动浏览器之一 - Firefox
此文主要演示 MacOX 下 WebDriver 启动 Firefox 浏览器,因 WebDriver 对 Firefox 浏览器是原生支持的,因而无需像启动其他浏览器一样需要相对应的 driver. ...
- Selenium2学习-011-WebUI自动化实战实例-009-JavaScript 在 Selenium 自动化中的应用实例之一(赋值)
通常在编写 Selenium 的 WebUI 自动化脚本时,有些元素不易定位元素,或有些元素为隐藏的(此时用 WebElement.getText() 获取其值的时候,返回的结果为空),对日常的 UI ...
- java版本区别
java版本区别 点我,点我,Eclipse几个版本号的区别(part1) 点我,点我,Eclipse几个版本号的区别(part2) 点我,点我,Eclipse几个版本号的区别(part3)
- Windows网络共享权限设置
文件共享权限有两种权限设置,只要理解这两种权限设置就可以在域控灵活运用. 第一种是网络共享权限 共享权限是控制用户通过网络访问共享文件夹的手段,共享权限仅当用户通过网络访问时才有效,本地用户不受此权限 ...
- play 之定时器job
play定时任务之job 要创建一个Job,只需要简单地继承play.jobs.Job类就可以. 一些常用的注解: @Every("1h") 每隔1小时执行一次 @ ...
- mysql慢查日志分析工具 percona-toolkit
备忘自: http://blog.csdn.net/seteor/article/details/24017913 1. 工具简介 pt-query-digest是用于分析mysql慢查询的一个工具, ...
- jquery-mockjax初试
1. 原理 jquery-mockjax是用于mock 前台ajax向后台请求的返回数据. 原理很简单 在你js代码要发送ajax请求的地方断点一下,然后比较在[引入jquery-mockjax] 和 ...