1

在声明局部变量之前初始化局部变量的规则是什么?是否可以在声明之前使用变量?我在此页面(局部变量声明问题)上看到它是非法的,但是当我尝试它时:

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

4 回答 4

1

看评论

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 语言规范中进行了解释。

执行后

String toHelp = args[0];

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

于 2013-10-12T14:20:33.140 回答
0
public static String toHelp = "--help";

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

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

于 2013-10-12T14:16:06.460 回答
0

toHelp是一个静态变量。它对您来说是可见的,main()因为它已经声明和初始化了。

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

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

于 2013-10-12T14:16:49.630 回答
0

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

如果你在 C# 中做了同样的事情(你包含的链接是 C# 而不是 Java)你确实会得到一个错误。那里的范围规则是不同的 - 在 C# 中,变量的范围是整个封闭块,因此它还包括声明之前但出现在块中的语句。如果您的示例是 C#,则其中的第一条语句main将访问未初始化的变量,这是编译器错误。

于 2013-10-12T16:38:38.217 回答