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方法创建另一个类并将该类设置为主类,那么它是否是一个更好的编程习惯?
答案 0 :(得分:5)
但是当我尝试按照上面的代码初始化变量thiz时, 编译器说非静态变量,这不能从a引用 静态背景。 但我不是在静态上下文中指这个 我是吗?
是的,你是。加载类时(而不是在创建对象实例时)初始化静态类变量。在该上下文中没有this
。代码:
private static javax.swing.JFrame thiz = this;
根本行不通。尽管你的断言恰恰相反,但你 做 想要一个单身人士。否则,给定N个MainMDI
对象的可能对象实例,您希望从静态上下文访问哪一个?您应该考虑重构代码,而不是试图强调Java语言语义。
答案 1 :(得分:3)
this
表示“当前正在操作的对象实例”,它只在非静态成员函数中有意义。通常,当您调用该成员函数时,this
会隐式传递给每个非静态成员函数,因此可以公平地说它是在调用非静态成员函数之前初始化的。
用“主”方法分解一个类是一个好主意,在很大程度上取决于实际的实现细节。