Java中的本地范围

时间:2011-08-31 11:06:52

标签: java scope

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

8 个答案:

答案 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等等)并且有时我们想要隐藏封闭块的变量。