为什么大括号没有在Java中定义单独的本地范围?我期待这是主要大括号语言(C,C ++,Java,C#)的共同特征。
class LocalScopeTester
{
public static void main(String... args)
{
Dog mine = new Dog("fido");
if (mine.getName().equals("ace"))
{
Dog mine = new Dog("spot"); // error: duplicate local
}
else
{
Dog mine = new Dog("barkley"); // error: duplicate local
{
Dog mine = new Dog("boy"); // error: duplicate local
}
}
}
}
答案 0 :(得分:17)
它们确实定义了一个单独的局部作用域,但您仍然无法屏蔽父作用域中的局部变量(但您当然可以屏蔽实例变量)。
但是你可以定义新的变量(使用不同的名称),它们的范围将限制在大括号内。
答案 1 :(得分:14)
Java中有意禁止本地变量阴影(see this answer) 这个想法是,这有助于减少错误。
答案 2 :(得分:3)
大括号会对变量进行范围调整,但大括号内的任何内容都可以“看到”大括号。在您拥有的所有情况下,mine
已被定义为fido。
更简洁地说。这些孩子的父母也是他们的父母,但反之亦然。
答案 3 :(得分:3)
它们确实定义了一个单独的局部范围,如果局部变量隐藏另一个范围,则会出错。
尝试在块内定义一个变量(具有唯一名称),然后从该块外部访问,以查看它确实是作用于块的范围,并且仅限于该块。
答案 4 :(得分:2)
块定义本地范围,但不允许您重新定义与外部本地范围中的另一个变量同名的变量。如果确实如此,就无法访问“隐藏”变量。
答案 5 :(得分:2)
它确实定义了一个局部范围......在花括号内声明的变量具有大括号的范围。但是,您要做的是重新声明已存在的变量。在我看来,在这种情况下,Java不是错误的,而是C ++让你这样做(我假设你正在比较它)。尽管如此,即使语言允许,你为什么要这样做呢?那里可读性差,可能导致错误。
答案 6 :(得分:0)
运行此命令,您将收到一个错误,即该变量已被声明为int i=5
,并且无法重新定义。所以,父母从不接受孩子的所得。
那么,如果父母牺牲并删除他对int i=5
的声明?
public class Ouch {
public static void main(String[] args) {
int i=5;
for(int i=0;i<5;i++);
for(int i=0;i<5;i++);
}
}
现在,父母牺牲了声明,两个孩子都喜欢并且代码成功运行。
public class Ouch {
public static void main(String[] args) {
//int i=5;
for(int i=0;i<5;i++);
for(int i=0;i<5;i++);
}
}
答案 7 :(得分:-1)
它在Java中被遗忘,但我认为Java是错误的,因为在所有“块结构化”语言中,它被授权执行此操作(不仅在C ++中,而且在Pascal,ADA,C等等)并且有时我们想要隐藏封闭块的变量。