Java 在声明变量之前使用它不是一个错误吗?

Java 在声明变量之前使用它不是一个错误吗?,java,locals,Java,Locals,在声明局部变量之前,它们的初始化规则是什么?可以在声明变量之前使用它吗?我在这页()上看到它是非法的,但是当我尝试它时,它是有效的: public static String toHelp = "--help"; public static void main(String[] args) { System.out.println(toHelp); String toHelp = args[0]; } 您已经将其声明并定义为“-help” 扫描仪输入将再次设置它 您已经将其

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

public static String toHelp = "--help";
 public static void main(String[] args) {
    System.out.println(toHelp);
    String toHelp = args[0];
 }
您已经将其声明并定义为“-help”

扫描仪输入将再次设置它

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


扫描仪输入将再次设置它。

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

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


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

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

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


如果是实例变量,则可以使用
this.toHelp
在方法中访问该变量。(在本例中)它是一个静态变量,您可以使用ClassName.to帮助区分这两个变量。

请参阅注释

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
访问本地文件。类
静态
变量现在需要使用
ClassName.toHelp来访问,因为它是隐藏的。

请参见注释

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
访问本地文件。类
静态
变量现在需要使用
ClassName.toHelp来访问,因为它是隐藏的。

您感到困惑的原因是C#和Java-For Java中局部变量作用域的规则不同(您用Java标记发布了这个问题)范围从变量声明发生的点开始,向下延伸到封闭块的末尾。因此,在您的示例中,
println
实际上没有考虑局部变量,而是考虑静态字段,因为局部变量在技术上不在该点的范围内


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

您感到困惑的原因是C#和Java-For Java中的局部变量作用域规则不同(您用Java标记发布了这个问题)范围从变量声明发生的点开始,向下延伸到封闭块的末尾。因此,在您的示例中,
println
实际上没有考虑局部变量,而是考虑静态字段,因为局部变量在技术上不在该点的范围内


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

我认为它不会受到阴影的影响,一个全新方法的局部变量被创建,对吗?@sᴜʀᴇsʜᴀᴛᴛᴀ JLS指出,某些声明可能会在其部分范围内被另一个同名声明所掩盖,在这种情况下,不能使用简单名称来引用已声明的实体。我认为这适用于这里。我发布的链接中甚至有一个例子。有道理,我认为阴影概念只适用于类型,子类型关系:),我想我必须仔细检查一下那个链接。我不认为它属于阴影,一个全新方法的局部变量,对吗?@sᴜʀᴇsʜᴀᴛᴛᴀ JLS指出,某些声明可能会在其部分范围内被另一个同名声明所掩盖,在这种情况下,不能使用简单名称来引用已声明的实体。我认为这适用于这里。在我发布的链接中甚至有一个例子。有道理,我认为阴影概念仅适用于类型,子类型关系:),我想我必须仔细检查一下该链接。对于Java:“toHelp”的第二个声明是否会创建一个新的局部变量(在函数级范围内),屏蔽文件范围变量?如果是这样的话,您将如何在函数的后面区分这两者?(上面由Sotirios Delimanolis回答:)如果它是一个实例变量,那么您可以使用
this.toHelp
。但是在这种情况下,它是一个静态变量,因此您可以使用
ClassName.toHelp
来区分它们。对于Java:“toHelp”的第二个声明是否会创建一个新的局部变量(在函数级范围内),屏蔽文件范围变量?如果是这样的话,您将如何在函数的后面区分这两者?(上面由Sotirios Delimanolis回答:)如果它是一个实例变量,那么您可以使用
this.toHelp
。但在本例中,它是一个静态变量,因此可以使用
ClassName.toHelp