黑马程序员_Java基础之if else、switch总结

                                                                                                        -----Java培训、Android培训、iOS培训、.Net培训、期待与您交流!

     在前几篇博客中主要是以笔者遇到的一些典型的题目为例子而展开的讨论,接下来几篇将是以知识点的结构进行讲述。本文主要是讲述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...

    }

    ...//后面可以跟0个或者多个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类型作为匹配条件。

时间: 2024-11-05 11:54:41

黑马程序员_Java基础之if else、switch总结的相关文章

黑马程序员_JAVA 基础加强学习笔记

一.面向对象 (一)继承  1.继承的好处: (1) 提高了代码的复用性. (2) 让类与类之间产生了关系,提供了另一个特征多态的前提. 注意: 子类中所有的构造函数都会默认访问父类中的空参数的构造函数,因为每一个子类构造内第一行都有默认的语句super();  如果父类中没有空参数的构造函数,那么子类的构造函数内,必须通过super语句指定要访问的父类中的构造函数. 如果子类构造函数中用this来指定调用子类自己的构造函数,那么被调用的构造函数也一样会访问父类中的构造函数. 2.final特点

黑马程序员_Java基础加强(下)

8.注解类 注解相当于一种标记,加了注解就等于打上了某种标记,没加就等于没打特殊标记,开发工具和其他程序可以用反射来了解你的类及各种元素上有无何种标记,看你有什么标记就去干什么事,标记可以加在包.类.字段.方法,方法的参数以及局部变量上. 注解的应用结构图: 为注解增加属性 定义基本类型的属性和应用属性 在注解类中增加String color(); @MyAnnotation(color = "red") 用反射方式获得注解对应的实例对象后,再通过该对象调用属性对应的方法 MyAnno

黑马程序员_Java基础加强(上)

1.静态导入 静态导入是jdk1.5版本以后出现的新特性,一般是指导入静态方法,如:import static java.lang.System.out 是指导入系统输出的静态方法. 例: import static java.lang.System.out //导入java.lang包下的System类的静态方法out public class StaticImport { public static void main(String[] args) { int x=1; x++; out.p

黑马程序员_Java基础_接口

------- android培训.java培训.期待与您交流! ---------- 0.接口知识体系 Java接口的知识体系如下图所示,掌握下图中的所有知识就可精通接口. 1.接口概论 1)接口概念 接口是从多个相似类中抽象出来的规范,接口中不包含普通方法,所有方法都是抽象方法,接口不提供实现.接口体现的是规范和实现分离的哲学.规范和实现分离正是接口的好处,让软件系统的各个组件之间面向接口耦合,是一种松耦合的设计.接口定义的是多个类共同的公共行为规范,定义的是一组公用方法. 2)接口与抽象类

黑马程序员_Java基础String类

- - - - - android培训.java培训.期待与您交流! - - - - - - - String是一个对象 String不属于8种基本数据类型(byte, char, short, int, float, long, double, boolean),String是对象,所以其默认值是null. String是一种特殊的对象,有其它对象没有的一些特性,通过JDK发现: public final class String implements java.io.Serializable

黑马程序员_java基础知识精华总结

本文总结了JAVA中的基础知识部分,具体包括:1.对象的初始化:2.2.继承时,对象的初始化过程:3.关于构造方法:4.有关public.private和protected:5.抽象类:6.final关键字:7.接口interface:8.多重继承:9.接口的嵌入:10.类的嵌入:11.异常类. 1.对象的初始化 (1)非静态对象的初始化在创建对象时,对象所在类的所有数据成员会首先进行初始化.基本类型:int型,初始化为0.如果为对象:这些对象会按顺序初始化.※在所有类成员初始化完成之后,才调用

黑马程序员_Java基础知识

java基础知识 1.Dos命令: dir:列出当前目录下所有的的文件及文件夹 md:创建目录 rd:删除目录 cd:进入指定mul cd\:返回到根目录 cd..:退到上级目录 del:删除文件 exit:退出dos命令行 *:通配符 help:帮助命令 2.path系统变量:系统中应用程序所在的路径 临时配置的环境变量的方式:用set命令完成 set:用于查看本机中所有环境变量的信息 set 变量名:查看具体的一个环境变量的值 set 变量名=:清空变量的值 set 变量名=具体值:赋值 在

黑马程序员_Java基础之 equals 与 ==

在我们写程序时经常会去比较两个变量是否相等,一般我们有两种方式去比较:equals与==,但是很多情况是不明就里,最后得出错误的结论.本文详解了equals与==. Java程序中测试两个变量是否的两种方式:一种是利用==另一种是equals方法.当时用 == 来判断两个变量是否相等时,如果两个变量是基本数据类型变量且都是数值类型(不一定要去数据类型完全相同),则只要两个变量的值相等就返回true. 但是对于两个引用类型变量, 他们必须指向同一个对象时,== 才会返回true.==不可用于比较两

黑马程序员_Java基础:多线程总结

------- android培训.java培训.期待与您交流! ---------- 一.多线程的概念 进程和线程经常会被人混淆,那是因为对它们的概念不明确.就拿我们平时使用的操作系统来说,它是多任务的操作系统,而多线程就是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程.比如在Windows系统中,一个运行的exe就是一个进程.  线程是指进程中的一个执行流程,一个进程中可以运行多个线程.比如平时下载的软件迅雷进程中可以