Java:变量 "this"什么时候初始化的?

标签 java constructor this static-members

public class MainMDI extends javax.swing.JFrame {

   private static MainMDI thiz; 

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

我正在 swing 创建一个 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 不能从静态上下文中引用。但我并不是在静态上下文中提到这一点,不是吗?这是因为变量this是非静态的,当静态变量this初始化时尚未初始化吗?

此外,如果我没有将 MainMDI 类设置为主类并创建另一个包含 main 方法的类并将该类设置为主类,这会是更好的编程实践吗?

最佳答案

But when I attempt to initialize variable thiz as in the above code, compiler says non-static variable this cannot be referenced from a static context. But I'm not referring to this in a static context here am I?

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

private static javax.swing.JFrame thiz = this; 

根本行不通。尽管您的主张与此相反,您确实想要一个单例。否则,给定 MainMDI 对象的 N 个可能的对象实例,您希望从静态上下文访问哪一个?您应该考虑重构您的代码,而不是尝试强制使用 Java 语言语义。

关于Java:变量 "this"什么时候初始化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15355478/

相关文章:

java - Java 中的异常处理 - Final

java - 关于信号量类

c++ - 为什么被破坏的对象比创建的多

Java - 强制子类在构造函数之后调用 super 方法

javascript - 为什么 classList.add 不适用于 html onClick

c++ - 在 C++ 中返回 "This"对象的函数

java - 恢复倒计时

java - 如何使用 XPATH 从 XML 中获取值

c++ - Ctor 初始化程序 : self initialization causes crash?

jquery - 在 jQuery 中设置索引