0
public class MainMDI extends javax.swing.JFrame {

   private static MainMDI thiz; 

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

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

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

public class MainMDI extends javax.swing.JFrame {

   private static MainMDI thiz = this; 

      public MainMDI() {
        initComponents();
      }
}  

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

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

4

2 回答 2

5

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

Yes, you are. Static class variables are initialized when the class is loaded (not when an object instance is being created). There is no this in that context. The code:

private static javax.swing.JFrame thiz = this; 

Will simply not work. Despite your assertions to the contrary, you do want a singleton. Otherwise, given N possible object instances of your MainMDI object, which one would you be expecting to access from a static context? You should consider refactoring your code rather than trying to strong-arm around Java language semantics.

于 2013-03-12T07:37:32.767 回答
3

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

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

于 2013-03-12T07:26:13.810 回答