Java中的本地范围

为什么大括号不在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 } } } } 

它们确实定义了一个单独的局部作用域,但您仍然无法屏蔽父作用域中的局部变量(但您当然可以屏蔽实例变量)。

但是您可以定义新变量(具有不同的名称),并且它们的范围将限制在大括号内。

Java中有意禁止本地变量阴影( 请参阅此答案 )。
这个想法是,这有助于减少错误。

大括号确实对变量进行了调整,但是大括号内的任何东西也可以“看到”大括号。 在你拥有的所有情况下, mine的已被定义为fido。

更简洁地说。 孩子们的父母也是他们的父母,但反之亦然。

它们确实定义了一个单独的局部范围,如果局部变量隐藏另一个范围,则会出错。

尝试在块内部定义变量(具有唯一名称),然后从该块外部访问以查看它确实确定了块的范围,并且仅限于该块。

块定义本地范围,但不允许您重新定义与外部本地范围中的另一个变量同名的变量。 如果确实如此,则无法访问“隐藏”变量。

它确实定义了一个局部范围……在花括号内声明的变量具有大括号的范围。 但是,您要做的是重新声明已存在的变量。 在我看来,在这种情况下,Java不是错误的,而是C ++让你这样做(我假设你正在比较它)。 尽管如此,即使语言允许,你为什么要这样做呢? 可读性差,可能导致错误。

运行这个,你会得到一个错误,该变量已经被声明为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++); } } 

它在Java中被遗忘,但我认为Java是错误的,因为在所有“块结构化”语言中,它被授权这样做(不仅在C ++中,而且在Pascal,ADA,C等等……)有时我们想要隐藏封闭块的变量。