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的选择题来问我. 之所以这么笃定地回答这个问题,并不是我知道其中原理,而是之前在一个群里,有人问了同类型的问题,我瞥了一眼记住了答案,所以才依葫芦画瓢. 小姐姐接着 ...
随机推荐
- 【读书笔记】iOS-流式音频与Pandora Radio之路
复杂性是不可避免的,而且只会随时间增长,所以在增加特性时一定要为重构和代码简化留出时间.真正遇到问题这前先不要担心性能.iPhone非常强壮,你可能永远也不会遇到预想的性能问题. 能过互联网向一个设备 ...
- python之递归与二分法
1. 递归 自己调用自己 递归的入口(参数) 和 出口(return) 树形结构的遍历 import os def func(lujing, n): lst = os.listdir(lujing) ...
- 【BI学习笔记】适合集成到项目里的BI:Wyn Enterprise
近日,我收到葡萄城的邮件,讲葡萄城开始进军BI领域,发布了一套BI和报表工具,叫Wyn Enterprise. 之前了解过PowerBI等面向终端用户的BI工具,我发现BI工具与Wyn Enterpr ...
- Android--判断是否连接成功了指定wifi
最近在做wifi的相关的东西,打印WifiInfo的时候 无意间发现一个参数,改参数可以查看是否连接成功了指定wifi,但是这是隐藏的,遂将其反射之.代码如下: //通过反射的方式去判断wifi是否已 ...
- Django基础篇--用户权限管理和组管理
Django作为一个成熟的python后台开发框架,为开发者提供了很多内置的功能,开发者只需要做一些配置就可以完成原生操作中比较复杂的代码编写.这些内置功能中其中一个比较强大的功能就是后台用户管理类. ...
- SQLserver 还原数据库报“指定转换无效”的错的解决方案
最近在附加一个数据库的时候遇到一个问题:“指定转换无效”,经过分析,出现这个问题的原因可能是:1.版本不对.2.文件加密.3.文件损坏 解决方法: 一.版本不对: 1. 首先确定源数据库版本,下面 ...
- WPF:验证登录后关闭登录窗口,显示主窗口的解决方法
http://www.27ba.com/post/145.html WPF:验证登录后关闭登录窗口,显示主窗口的解决方法 最近想做一个基于Socket的通讯工具,想模仿QQ那样,需要先登录,登录成功后 ...
- 7z常用命令行&7z检测压缩包完整性&7z压缩包错误不执行rsync同步
7Z简介&常用命令 7Z脚本使用说明 7Z检测压缩包完整性脚本 7Z压缩包错误不执行Rsync脚本 1.7Z简介&常用命令 ⑴简介: 7z,全称7-Zip, 是一款开源软件.是目前公认 ...
- 【PAT】B1027 打印沙漏(20 分)
#include<cstdio> #include<stdlib.h> char C='*'; int qiushu(int hang){//输入行数,求出字符数 int su ...
- Linux 小知识翻译 - 「Linux之父 Linus」
作为新年的第一次,这次想简单介绍下Linus这个人.(这篇文章是作者新年初写的,所以有这么句话) Linux之父,同时也是现在linux内核开发最终决定的人物就是「Linus Torvalds」.「L ...