Java 无法从静态主函数内部调用非静态构造函数

Java 无法从静态主函数内部调用非静态构造函数,java,compiler-errors,static,Java,Compiler Errors,Static,好吧,在你为我的命名惯例对我大喊大叫之前,让我说我知道我的变量名有多糟糕。我一直在试图找出java.swing事件处理的方法,最后我找到了一个我认为可以工作的示例程序,但它给了我一个错误“不能从静态上下文引用非静态变量”。它在我调用构造函数的底部给出了一个错误,所以我认为这个错误与构造函数中使用的“this”对象有关,或者由于某种原因,它不允许我从静态主函数内部调用非静态构造函数。如何修复此问题?您的内部类、事件和事件都不是静态的——它们属于主类的特定实例(或者,换句话说,每个实例都有自己的内部

好吧,在你为我的命名惯例对我大喊大叫之前,让我说我知道我的变量名有多糟糕。我一直在试图找出java.swing事件处理的方法,最后我找到了一个我认为可以工作的示例程序,但它给了我一个错误“不能从静态上下文引用非静态变量”。它在我调用构造函数的底部给出了一个错误,所以我认为这个错误与构造函数中使用的“this”对象有关,或者由于某种原因,它不允许我从静态主函数内部调用非静态构造函数。如何修复此问题?

您的内部类、
事件和
事件都不是
静态的
——它们属于
类的特定实例(或者,换句话说,每个实例都有自己的内部类)。但是,
main
方法
静态的
,因此不能从中引用实例成员(即使它们是类!)


将内部类以及它们所依赖的
Main
的数据成员更改为
static
应该可以解决问题。

由于事件是非静态内部类,因此必须初始化父类的引用

选项1:

您只需在静态方法中使用以下语句调用内部类构造函数:

public class Main {
    private JLabel lb = new JLabel();
    private JButton btn = new JButton();

    public class events extends JFrame{
        public events(){
            setLayout(new FlowLayout());

            btn = new JButton("Click for text");
            lb = new JLabel();

            add(btn);
            add(lb);

            event  e = new event();
            btn.addActionListener(e);

        }
        public static stConst() {

        }
    }

    public class event implements ActionListener{
        public void actionPerformed(ActionEvent e) {
            lb.setText("Now there is text here.");
        }
    }

    public static void main(String[] args) {
        events gui = new events();
        gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        gui.setSize(300, 300);
        gui.setVisible(true);
    }
}
选项2:

创建一个非静态函数(比如init),然后从该函数创建事件实例。从静态函数创建父类的实例,然后调用此非静态函数:

events gui = new Main().new events();
输出:


因此,如果您知道您的命名约定,为什么不修复它们呢?;)您的类
event
没有实现
ActionListener
idk的抽象方法这就像一个非常随意的示例,我只是用它来帮助自己学习如何使用事件监听器除了编写“implemets ActionListener”之外,我还需要做更多的事情吗?让嵌套类成为静态类<代码>公共静态类事件
如果我只取内部类并在main之外定义它们,它是否也能解决问题?或者它们在外部也必须是静态的吗?@hyphxnated顶级类是隐式静态的——这也可以工作
public static void main(String[] args) {
    Main main = new Main();
    main.init();
}

public void init() {
    events gui = new events();
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    gui.setSize(300, 300);
    gui.setVisible(true);

}