在声明变量之前使用变量不是错误吗?

时间:2013-10-12 14:15:17

标签: java locals

在声明它们之前初始化局部变量的规则是什么?是否可以在声明之前使用变量?我在这个页面上看到Local Variable Declaration Issue)它是非法的,但是当我尝试它时,它会起作用:

public static String toHelp = "--help";
 public static void main(String[] args) {
    System.out.println(toHelp);
    String toHelp = args[0];
 }

4 个答案:

答案 0 :(得分:2)

参见评论

public static void main(String[] args) {
    System.out.println(toHelp); // using the already initialize static variable
    String toHelp = args[0]; // shadowing the static variable with a local variable
} 

Java Language Specification here.

中解释了阴影

执行

String toHelp = args[0];

您在范围内有两个名为toHelp的变量。可以使用名称toHelp访问本地帐户。现在需要使用static访问类ClassName.toHelp变量,因为它已被遮蔽。

答案 1 :(得分:1)

toHelp是一个静态变量。它已经声明并初始化为main()可见。

如果您询问args,那么它是一个方法参数,因此,它已经被声明为方法声明本身的一部分。

如果它是一个实例变量,那么您可以使用this.toHelp来访问该方法中的变量。并且(在本例中)是一个静态变量,您可以使用ClassName.toHelp来区分这两个变量。

答案 2 :(得分:1)

您感到困惑的原因是本地变量作用域的规则在C#和Java中是不同的 - 对于Java(您使用Java标记发布了问题),作用域从变量声明发生的位置开始并向下扩展到封闭区块的末尾。因此,在您的示例中,println实际上不会考虑局部变量,而是考虑静态字段,因为此时局部变量在技术上不在范围内。

如果您在C#中执行相同的操作(您包含的链接是针对C#而不是Java),那么您确实会收到错误消息。范围规则是不同的 - 在C#中,变量的范围是整个封闭块,因此它还包括声明之前但出现在块中的语句。如果您的示例是C#,main中的第一个语句将访问非初始化变量,这是编译器错误。

答案 3 :(得分:0)

public static String toHelp = "--help";

您已经声明并将其定义为“--help”。

扫描仪输入只会再次设置。