在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?
}
}
最佳答案
区别在于不是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
内的静态方法中简单地键入A
等效于A.nonStatic
,这是一个问题,无论它写在哪里。 nonStatic
是一个实例字段,因此无法静态访问(在任何地方都可以作为A.nonStatic
,或在nonStatic
的静态方法中可以作为A
)