zoukankan      html  css  js  c++  java
  • 【Java面试题】1 Java中使用switch-case的用法及注意事项超全总结

    今天在用到switch的时候,这种设计到最基本的内容,可能忘记它的一些基本语法,出现了一些错误,所以即兴从各种资料查询总结了下面的内容,希望可以帮助那些正在困扰switch错误和各种细节问题的朋友! 

    1.switch-case注意事项:

        switch(A),括号中A的取值只能是整型或者可以转换为整型的数值类型,比如byte、short、int、char、还有枚举;需要强调的是:long和String类型是不能作用在switch语句上的。

         case B:C;case是常量表达式,也就是说B的取值只能是常量(需要定义一个final型的常量,后面会详细介绍原因)或者int、byte、short、char(比如1、2、3、200000000000(注意了这是整型)),如果你需要在此处写一个表达式或者变量,那么就要加上单引号; case后的语句可以不用大括号,就是C不需要用大括号包裹着;

         default就是如果没有符合的case就执行它,default并不是必须的.

    2.案例分析:

    1.标准型(case后面都有break语句,case后的值都是整数)

    int i=3; 
    
    switch(i) 
    
    { 
    
    case 1: 
    
    System.out.println(1); 
    
    break; 
    
    case 2: 
    
    System.out.println(2); 
    
    break;  
    
    default: 
    
    System.out.println("default"); 
    
    break; 
    
    } 

    2.常量型(case后面都有break语句,case后的值都是常量)

    private final int NUM1=1private final int NUM2=1int i=3; 
    switch(i) 
    { 
    case NUM1: 
    System.out.println(1); 
    break; 
    case NUM2: 
    System.out.println(2); 
    break;  
    default: 
    System.out.println("default"); 
    break; 
    } 

    3.表达式型(case后面都有break语句,case后的值都是表达式)

    int i=3; 
    
    int b = 2;
    
    switch(i) 
    
    { 
    
    case '类名.getId()': 
    
    System.out.println(1); 
    
    break; 
    
    case 'b' 
    
    System.out.println(2); 
    
    break;  
    
    default: 
    
    System.out.println("default"); 
    
    break; 
    
    }

    3.使用switch时的出错分析:

    1).第二种情况容易出错的情况:

     发现问题

    private int CLICK_QUERY = 1;
    
    private int CLICK_RESET = 2;
    
    @Override
    
    public void onClick(View v)
    
    {
    
     int tag = (Integer) v.getTag();
    
     switch (tag)
    
     {
    
      case CLICK_QUERY:
    
       query();
    
      break;
    
      case CLICK_RESET:
    
       reset();
    
      break;
    
     }
    
    }

    编译时一直报错:CLICK_QUERY 和CLICK_RESET——case expressions must be constant expressions

    解决问题

       case后面必须跟常量,必须要常量,将上面两个变量声明为final即可。

    private final int CLICK_QUERY = 1;

    private final int CLICK_RESET = 2;

    2).下面是switch的简单写法:

    switch(A){

    case B;

    }

    A部分中的值必须是int型的,或者是能够自动进行饮试转换成int型的表达式。也就是说A部分可以是byteshortcharint型(因为这几种类型都可以自动转换为int型)的。

       其次要强调的是该程序中B部分的值必须是单个byteshortcharint型的值,或者是final型的变量。

    但是final型的变量也是有要求的,也即是它必须是编译时的常量,怎么讲呢,看下面的程序段:

    final int a = 0;

    final int b;

       第二个语句就是在编译时不能够被识别出值的变量,因为它没有初始化,当然,这条语句也是错误的。所以总结case后的值可以是常数值或final型的值。再看下面的程序段:

    public class TestSwitch {
    
     public static void main(String[] args){
    
      byte a = 11;
    
      switch(a){// C
    
      case 11 : System.out.println(" 11 "); break;
    
      case 225 : System.out.println(" 11 "); break;// D
    
      }
    
     }
    
    }

    该代码正确吗?答案是否定的。虽然在 C 处是合法的也即是byte型的a值可以出现在switch中,但是 D处的语句也即是第二个case后的值是225大小超过了byte的范围,所以是错误的。再就是case后的值不能出现重复。因此在使用中要注意。

    3.忘记写break的错误

       再就是在使用switch-case中最容易忽视的就是忘记在每个case后处理完后忘记写上break;语句。那它带来的后果是什么呢,下面小程序段会告诉你:

    public class TestSwitchCase {
    
     public static void main(String[] args){
    
      byte a = 2;
    
      switch(a){
    
      case 1 : System.out.println(" A ");
    
      case 2 : System.out.println(" B ");
    
      case 3 : System.out.println(" C ");
    
      case 4 : System.out.println(" D ");
    
      default : System.out.println(" default ");
    
      }
    
     }
    
    }
    
    =========输出结果为:
    
     B 
    
     C 
    
     D 
    
     default 
    
    --------------------------

    看到了吗?连default都执行,注意结束符break;就OK了。

  • 相关阅读:
    201215-03-19---cocos2dx内存管理--具体解释
    sqlHelper的增删改查
    Java Web的数据库操作(一)
    Myeclipse 中添加mysql的jdbc驱动
    MySQL索引的创建、删除和查看
    搭建Windows下Java Web开发环境
    Qt 格式化字符串
    实现C++模板类头文件和实现文件分离的方法
    Qt Creator实现状态栏显示
    Win7 64位下配置Qt5.3和Wincap
  • 原文地址:https://www.cnblogs.com/guweiwei/p/6591488.html
Copyright © 2011-2022 走看看