java Switch中的case后面加上大括号({})和不加大括号的区别
java基础求真之switch 的case 后面加上大括号和不加大括号的区别。
下面给出三段代码大家看一下有什么不同以及哪段代码能够编译通过那段代码编译不能通过,为什么?(Why?)
代码片段一:
int value = 10;
switch (value) {
case 1:
int value1 = 5;
break;
case 2:
int value1 = 6;
break;
}
代码片段二:
int value = 10;
// switch
switch (value) {
case 1: {
int value1 = 5;
break;
}
case 2:
int value1 = 8;
break;
}
代码片段三:
int value = 10;
// switch
switch (value) {
case 1: {
int value1 = 5;
break;
}
case 2: {
int value1 = 8;
break;
}
}
}
好了,三段代码都已经给出了,大家看出来那段代码能够编译通过?那段代码编译不同断过了吗?
猛地一看似乎没有多大的区别,不就是case后面加上{}和不加上大括号的区别吗?
好吧,废话不多说了,我这边公布答案:片段1:不能通过编译器的编译,片段2和片段3可以通过编译器的编译。但是为什么呢?这是一个问题。
想要弄明白这个问题,就要先弄明白Java总变量的作用域问题。我们都知道在java(其他语言也是如此例如:C/C++/java/C#等)中同一个作用域中不能有两个相同的变量名称,(因为如果两个变量名相同容易造成混淆,编译器不知道到底该用那个变量)。
片段1中的两个value1的作用域都在switch的{}内。根据“同一个作用域中
不能有两个名称相同的变量名”的出片段1肯定不能编译通过
片段2中的两个value1的作用域分别为:case 1:中的value1的作用域为case1的{}内。
case 2中的value1的作用域为switch的{}内。两个变量的作用域不同,当然可以定义相同的变量名称了。
片段3中的两个value的作用域分别为:case 1中的value1的作用域为case 1的{}内,
case 2中的value1的作用域为case 2的{}内,所以两个作用域互不交叉,因此编译能够通过。
注意:switch()的{}外面有一个value变量名,此时你不能在case 的{}中定义变量名称为value的
变量,因为switch()的{}外的value变量的作用域包含了case{}内的作用域,
所以现在大家知道case中加上{}和不加{}有什么不同了吗?这里我就不说了,大家自己理解。下面说一下使用场合。
使用场合:为了防止在case块中定义相同变量名而出现编译不同过的情况,我们通常会加上{}(目前就知道这种情况,如果以后遇到了再补充)。
所以通常情况下是不必加上{}的。该怎么做就怎么做。
朋友们如果有不同的意见欢迎指正,大家共同进步。
java Switch中的case后面加上大括号({})和不加大括号的区别的更多相关文章
- 在switch中的case语句中声明变量编译出错的解决方案
在switch中的case语句中声明变量编译的问题 先来看段代码,别管什么意思: : , j = ; ; i < ; i++) recive_phone[i] = msgbuf.text[i]; ...
- 在switch中的case语句中声明变量会被提前
原文链接:http://my.oschina.net/u/2000201/blog/514384 本人今天在编写工具类时,无意之间发现,在Java的Swith语句的case语句中声明局部变量时出现了一 ...
- switch中的case不加break执行情况
输出结果:230 分析,switch先匹配一个case满足$a,然后执行case里面的语句,直到遇到break,否则一直往下执行 <?php $a = ; switch($a){ : echo ...
- java 泛型中 T、E ... 和 问号(通配符)的区别
一.泛型中T.E ... 是泛型类.泛型方法定义时候用的. 1.泛型类定义在类后面 紧跟类名后面 public class TestClassDefine<T>{} 2.泛型方法定义在方 ...
- 关于引用类型作为参数加上ref与不加ref的区别
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...
- C++中创建对象的时候加括号和不加括号的区别
c++创建对象的语法有----- 1 在栈上创建 MyClass a; 2 在堆上创建加括号 MyClass *a= new MyClass(); 3 不加括号 MyClass *a = new My ...
- C++中创建对象的时候加括号和不加括号的区别(转)
c++创建对象的语法有----- 1 在栈上创建 MyClass a; 2 在堆上创建加括号 MyClass *a= new MyClass(); 3 不加括号 MyClass *a = new My ...
- Java继承中的转型及其内存分配
看书的时候被一段代码能凌乱啦,代码是这样的: package 继承; abstract class People { public String tag = "疯狂Java讲义"; ...
- 为什么switch里的case没有break不行
前言 一个小姐姐拿着一个switch的选择题来问我. 之所以这么笃定地回答这个问题,并不是我知道其中原理,而是之前在一个群里,有人问了同类型的问题,我瞥了一眼记住了答案,所以才依葫芦画瓢. 小姐姐接着 ...
随机推荐
- React中props和state相同点和不同点
朋友们,我想死你们了,最近这几天忙着和病魔作斗争所以没怎么写博客,今天感觉好点了,赶紧来写一波,就是这木敬业. 今天我们来讨论讨论props和state相同点和不同点 首先我来概要说明一下这两者 pr ...
- 开发Hexo主题(一)
Hexo是一款静态博客工具,由Node.js编写 在博客根目录的themes下,新建文件夹(文件夹名为主题名) 主题目录结构如图 这里使用模版引擎为Ejs 在Layout目录下新建index.ejs文 ...
- 使用 ISO镜像配置 本地yum 源(RHEL, CentOS, Fedora等适用)
使用 ISO镜像配置 本地yum 源(RHEL, CentOS, Fedora等适用) 1.上传ISO镜像和挂载 1) 上传Centos7.2 ISO镜像到 /usr/local/src目录 2) ...
- 将Windows下的InfluxDB、Grafana做成Windows服务
从网上下载的Windows下的InfluxDB.Grafana,都是控制台程序,打开窗口后,很容易被别人给关掉,因此考虑做成Windows服务,nssm正是解决该问题的利器. 1.下载nssm htt ...
- 小程序 青少儿书画 利用engineercms作为服务端
因为很多妈咪们喜欢发布自己宝宝的作品,享受哪些美好时刻,记录亲子创作过程. 为了方便妈咪们展示亲子创作,比如宝宝们画作,涂鸦,书法,作文,其他才艺,特利用engineercms作为服务端,重新设计了一 ...
- mybatis学习系列四--mybatis generator逆向工程
采用命令行方式执行逆向工程 1.配置文件generatorConfig.xml 保存在目录:D:\E\workspace\eclipse\mybatis_generator <?xmlversi ...
- (转载)Oracle 树操作(select…start with…connect by…prior)
转载地址:https://www.cnblogs.com/linjiqin/p/3152674.html 备注:如有侵权,请立即联系删除. oracle树查询的最重要的就是select…start w ...
- Oracle 11g 发行版2的安装,PLSQL_Developer安装 , Oracle数据库安装失败,完全卸载,常用的命令
Oracle 11g 发行版2的安装 PLSQL_Developer安装 Oracle数据库安装失败,完全卸载oracle11g 常用的命令 Oracle 11g 发行版2的安装 1. 下载 下载地址 ...
- vsftpd不支持目录软链接的解决办法
vsftpd本身不支持软连接,而在用FTP共享的时候又不想移动文件位置,便在网上找到了一个workaround: Linux内核从2..0开始支持把一部分文件系统挂载到文件系统中的其他位置,mount ...
- 17秋 软件工程 团队第五次作业 Alpha Scrum9
17秋 软件工程 团队第五次作业 Alpha Scrum9 今日完成的任务 世强:APP后端部门申请状态: 港晨:主页面代码实现: 树民:完善超级管理员web后端: 伟航:设置页面和侧边栏的原型: 陈 ...