Java:变量“this”何时初始化?

时间:2013-03-12 07:22:37

标签: java constructor this static-members

public class MainMDI extends javax.swing.JFrame {

   private static MainMDI thiz; 

      public MainMDI() {
        initComponents();
        thiz = this;
      }
}  

我正在创建一个MDI应用程序。 MainMDI类是应用程序的主类,因此main方法驻留在该类中。上面的代码创建了一个名为thiz的静态变量,它指向应用程序运行时类MainMDI的实例。

我打算使用变量thiz从main方法中访问MainMDI类的非静态(实例)成员。(我无法从main方法中访问非静态成员,因为main方法是静态的我的应用程序中的MainMDI类中的成员。)

public class MainMDI extends javax.swing.JFrame {

   private static MainMDI thiz = this; 

      public MainMDI() {
        initComponents();
      }
}  

但是当我尝试初始化变量thiz时,如上面的代码,编译器说非静态变量,这不能从静态上下文引用。但我不是在静态环境中提到这个,不是吗?这是因为变量this(非静态的)在初始化静态变量时尚未初始化吗?

另外,如果我没有将类MainMDI设置为主类并使用main方法创建另一个类并将该类设置为主类,那么它是否是一个更好的编程习惯?

2 个答案:

答案 0 :(得分:5)

  

但是当我尝试按照上面的代码初始化变量thiz时,   编译器说非静态变量,这不能从a引用   静态背景。 但我不是在静态上下文中指这个   我是吗?

是的,你是。加载类时(而不是在创建对象实例时)初始化静态类变量。在该上下文中没有this。代码:

private static javax.swing.JFrame thiz = this; 

根本行不通。尽管你的断言恰恰相反,但你 想要一个单身人士。否则,给定N个MainMDI对象的可能对象实例,您希望从静态上下文访问哪一个?您应该考虑重构代码,而不是试图强调Java语言语义。

答案 1 :(得分:3)

this表示“当前正在操作的对象实例”,它只在非静态成员函数中有意义。通常,当您调用该成员函数时,this会隐式传递给每个非静态成员函数,因此可以公平地说它是在调用非静态成员函数之前初始化的。

用“主”方法分解一个类是一个好主意,在很大程度上取决于实际的实现细节。