从静态上下文引用非静态变量

时间:2014-09-26 14:32:48

标签: java static non-static

我正在阅读Kathy和Bert SCJP 1.6并遇到以下代码:

class Bar {
int barNum = 28;
}

class Foo {
  Bar myBar = new Bar();
  void changeIt(Bar myBar) {
    myBar.barNum = 99;
    System.out.println("myBar.barNum in changeIt is " + myBar.barNum);
    myBar = new Bar();
    myBar.barNum = 420;
    System.out.println("myBar.barNum in changeIt is now " + myBar.barNum);
 }
  public static void main (String [] args) {
    Foo f = new Foo();
    System.out.println("f.myBar.barNum is " + f.myBar.barNum);
    f.changeIt(f.myBar);
    System.out.println("f.myBar.barNum after changeIt is "
    + f.myBar.barNum);
 }
}

虽然它是阴影变量的主题,但我无法理解如何在main()方法(静态)中引用非静态变量myBar?

2 个答案:

答案 0 :(得分:5)

诀窍是myBar访问的上下文不是静态的。

通过编写f.myBar而不仅仅是myBar,您可以在f(局部变量)中存储的实例的上下文中访问它。

这是常用模式启动应用程序的基础。

public class Main {
   private final Foo param1;
   private final Bar param2;       


   private Main( Foo initParam1, Bar initParam2 ) {
      //initialise the fields 
   }

   private void run() {
      // execute the application
   }

   public static void main( String [] args ) {
      // parse the command line arguments
      Foo parsedParam1 = ...
      Bar parsedParam2 = ...
      Main main = new Main( parsedParam1, parsedParam2 );
      main.run();
   }
}

答案 1 :(得分:3)

Java中的

static变量属于Class,其值对于该类的所有实例保持相同。 将类加载到JVM 时,初始化{{1>}变量。

另一方面,实例变量对每个实例具有不同的值。它们是在使用static运算符或使用new之类的反射创建对象实例时创建的。所以在你的情况下:

Class.newInstance()

因此,如果您尝试访问非静态变量而没有任何实例编译器会给您一个错误,因为这些变量尚未创建,因此不存在。