在Java中,当我们想从静态方法访问非静态变量时,会出现编译错误:
“无法静态引用非静态字段nonStatic”
但是我使用静态方法创建了另一个类,因此可以到达该非静态变量。为什么是这样?
因此,在A类中,“ return nonStatic”行和“ nonStatic = 4”行是错误的。但是在类App方法m中,而类B方法m是有效的。
public class App
{
public static void main( String[] args )
{
A a = new A();
m( a );
System.out.println(a.nonStatic);
}
static void m( A a ) {
a.nonStatic = 12; //its good...why?
}
}
class A{
int nonStatic = 7;
static int getOrSetNonStatic(){
// return nonStatic; //error
// nonStatic = 4; //error
return 0;
}
}
class B {
static void m( A a ) {
a.nonStatic = 12; //its good...why?
}
}
答案 0 :(得分:2)
因为您将它作为参数传递给了方法。
如果为方法参数指定其他名称,可能会更清楚。然后您会看到,成员字段不是作为a可见的,而仅在参数名称下可见。
答案 1 :(得分:2)
与众不同的不是nonStatic
是从其他类访问的事实。
尝试在A中执行此操作,它将编译:
class A {
int nonStatic = 7;
static void m( A a ) {
a.nonStatic = 12;
}
}
那么有什么区别呢?这是在以下位置读取静态变量的内容:
a.nonStatic
访问实例上的nonStatic
。不管这段代码在哪里,都可以。nonStatic
内部的实例(非静态)方法中简单地输入A
与a.nonStatic
(即, this.nonStatic
)。这是允许的。nonStatic
内的 static 方法中简单地输入A
等效于A.nonStatic
,无论写在哪里,都是一个问题。 nonStatic
是一个实例字段,因此无法静态访问(在任何地方都可以A.nonStatic
或在nonStatic
的静态方法中以A
的形式访问)