在声明它们之前初始化局部变量的规则是什么?是否可以在声明之前使用变量?我在这个页面上看到Local Variable Declaration Issue)它是非法的,但是当我尝试它时,它会起作用:
public static String toHelp = "--help";
public static void main(String[] args) {
System.out.println(toHelp);
String toHelp = args[0];
}
答案 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”。
扫描仪输入只会再次设置。