Java:变量"this"何时初始化?

Pra*_*anD 0 java constructor this static-members

public class MainMDI extends javax.swing.JFrame {

   private static MainMDI thiz; 

      public MainMDI() {
        initComponents();
        thiz = this;
      }
}  
Run Code Online (Sandbox Code Playgroud)

我正在创建一个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();
      }
}  
Run Code Online (Sandbox Code Playgroud)

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

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

Per*_*ion 5

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

是的,你是.加载类时(而不是在创建对象实例时)初始化静态类变量.this在这方面没有.代码:

private static javax.swing.JFrame thiz = this; 
Run Code Online (Sandbox Code Playgroud)

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

  • 我想你确实需要一个单身Prashan.不是为了阻止对象的多个实例化,而是为了支持从静态上下文中初始化字段,就像你试图做的那样.但无论如何,如果对象只是一次实例化,为什么你需要`thiz`? (2认同)