在Java中,当我们想从静态方法访问非静态变量时,我们得到一个编译错误:
"无法对非静态字段进行静态引用 非静态">
但是我用静态方法创建了另一个类,我可以达到那个非静态变量。这是为什么呢?
所以在类 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
。无论此代码在哪里,都可以。 - 只需在
A
内部的实例(非静态(方法中键入nonStatic
类似于a.nonStatic
(即this.nonStatic
(。这是允许的。 - 简单地在
A
内部的静态方法中键入nonStatic
等效于A.nonStatic
,无论它写在哪里都是一个问题。nonStatic
是一个实例字段,因此不能静态访问它(A.nonStatic
任何地方,或nonStatic
在静态方法中A
(
因为你把它作为参数传递到方法中。
如果给方法参数一个不同的名称,也许会更清楚。然后,您将看到成员字段不可见,而仅在参数名称下可见。