Java 静态变量和局部变量
Java static variables and local variables
我是 Java 的新人,遇到了一个 OCJA-1.8 示例问题,对此我有一些疑问。我需要澄清 JVM 的这种行为。
public class Test{
static int x=1;//**This is static class level variable**
public static void main(String[] args){
int[] nums={1,2,3,4,5};
for(int x:nums){ // Local variable declared for for-each loop.
System.out.println(x);
}
}
}
为什么JVM没有抛出重复变量的错误,对于在每个循环中声明的变量'int x'。由于静态变量具有 class 级范围 ?
x 的内部变量声明覆盖了静态变量声明。
如果您需要访问静态变量,您可以使用 Test.x
访问它
局部变量在一定程度上隐藏了原来的静态字段,但并非不可访问:
Test.x
对于非静态字段:
this.x // not in this case
所以它是允许的,实际上人们经常看到:
public class Pt {
private final int x;
public Pt(int x) {
this.x = x;
}
}
这避免了引入一些约定 (_x, mX) 的需要。
不允许的内容:
void f() {
int x = 42;
if (true) {
int x = 13; // COMPILER ERROR
...
}
}
由于这种风格不好,造成混乱。
重复变量编译错误发生在同一范围内声明的两个同名变量:字段或方法声明范围。
在您的示例中,每个变量都在不同的范围内声明。
因此,当您在声明 x
的方法中引用 x
时,默认情况下它指的是具有更近可用范围的变量(x
局部变量),因此会遮蔽另一个变量(x
字段变量)。
引用阴影变量:
- 如果它是静态字段(您的情况),请在其前面加上 class 声明它的名称:
Test.x
- 如果它是实例字段,请在其前面加上
this
关键字:this.x
当你有一个与静态变量相同的局部变量时,class 的静态变量被局部变量遮蔽。
它不会抛出错误,因为 Java 使用了 shadowing. In essence, the variable with the lowest scope 的概念。
静态字段仍然可以访问,你只需要完全限定它:
for(int x:nums){
System.out.println(x); // Local x
System.out.println(Test.x); // static x
}
这可能会使您的代码 reader 混淆,因此在大多数情况下应避免使用。如果您发现自己的字段和局部变量的名称相同,那么 可能 有问题,您应该重新评估变量的命名方式。
在您的具体情况下,x
不是描述性名称,两个变量都将从更好、更具描述性的名称中受益。
在某些情况下,例如在构造函数或 setter 方法中,具有相同名称的局部变量和字段是有益的,这就是隐藏功能的有用之处。
我是 Java 的新人,遇到了一个 OCJA-1.8 示例问题,对此我有一些疑问。我需要澄清 JVM 的这种行为。
public class Test{
static int x=1;//**This is static class level variable**
public static void main(String[] args){
int[] nums={1,2,3,4,5};
for(int x:nums){ // Local variable declared for for-each loop.
System.out.println(x);
}
}
}
为什么JVM没有抛出重复变量的错误,对于在每个循环中声明的变量'int x'。由于静态变量具有 class 级范围 ?
x 的内部变量声明覆盖了静态变量声明。
如果您需要访问静态变量,您可以使用 Test.x
局部变量在一定程度上隐藏了原来的静态字段,但并非不可访问:
Test.x
对于非静态字段:
this.x // not in this case
所以它是允许的,实际上人们经常看到:
public class Pt {
private final int x;
public Pt(int x) {
this.x = x;
}
}
这避免了引入一些约定 (_x, mX) 的需要。
不允许的内容:
void f() {
int x = 42;
if (true) {
int x = 13; // COMPILER ERROR
...
}
}
由于这种风格不好,造成混乱。
重复变量编译错误发生在同一范围内声明的两个同名变量:字段或方法声明范围。
在您的示例中,每个变量都在不同的范围内声明。
因此,当您在声明 x
的方法中引用 x
时,默认情况下它指的是具有更近可用范围的变量(x
局部变量),因此会遮蔽另一个变量(x
字段变量)。
引用阴影变量:
- 如果它是静态字段(您的情况),请在其前面加上 class 声明它的名称:
Test.x
- 如果它是实例字段,请在其前面加上
this
关键字:this.x
当你有一个与静态变量相同的局部变量时,class 的静态变量被局部变量遮蔽。
它不会抛出错误,因为 Java 使用了 shadowing. In essence, the variable with the lowest scope 的概念。
静态字段仍然可以访问,你只需要完全限定它:
for(int x:nums){
System.out.println(x); // Local x
System.out.println(Test.x); // static x
}
这可能会使您的代码 reader 混淆,因此在大多数情况下应避免使用。如果您发现自己的字段和局部变量的名称相同,那么 可能 有问题,您应该重新评估变量的命名方式。
在您的具体情况下,x
不是描述性名称,两个变量都将从更好、更具描述性的名称中受益。
在某些情况下,例如在构造函数或 setter 方法中,具有相同名称的局部变量和字段是有益的,这就是隐藏功能的有用之处。