在声明局部变量之前初始化局部变量的规则是什么?是否可以在声明之前使用变量?我在此页面(局部变量声明问题)上看到它是非法的,但是当我尝试它时:
public static String toHelp = "--help";
public static void main(String[] args) {
System.out.println(toHelp);
String toHelp = args[0];
}
看评论
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
}
执行后
String toHelp = args[0];
您有两个名称toHelp
在范围内的变量。可以使用其名称访问本地的toHelp
。类static
变量现在需要被访问,ClassName.toHelp
因为它被遮蔽了。
public static String toHelp = "--help";
您已经声明了它并将其定义为等于“--help”。
扫描仪输入只会再次设置它。
toHelp
是一个静态变量。它对您来说是可见的,main()
因为它已经声明和初始化了。
如果你问的是args
,那么它是一个方法参数,因此它已经被声明为方法声明本身的一部分。
如果它是一个实例变量,那么您可以this.toHelp
在方法中使用它来访问它。并且(在这种情况下)它是一个静态变量,您可以使用 ClassName.toHelp 来区分这两个变量。
您感到困惑的原因是局部变量范围的规则在 C# 和 Java 中是不同的 - 对于 Java(您使用 Java 标记发布了问题),范围从变量声明发生的点开始并向下延伸到最后的封闭块。因此,在您的示例中,println
实际上并未考虑局部变量,而是考虑静态字段,因为此时局部变量在技术上不在范围内。
如果你在 C# 中做了同样的事情(你包含的链接是 C# 而不是 Java)你确实会得到一个错误。那里的范围规则是不同的 - 在 C# 中,变量的范围是整个封闭块,因此它还包括声明之前但出现在块中的语句。如果您的示例是 C#,则其中的第一条语句main
将访问未初始化的变量,这是编译器错误。