3

我正在运行下面的小程序。在其中,当我添加构造函数(甚至是空的)时,小程序会引发运行时异常:

MainFrame.class can't be instantiated, java.lang.InstantiationException 

如果我删除构造函数,则不会抛出异常。小程序中不能有构造函数吗?

public class MainFrame extends JApplet implements  WindowListener, ActionListener {
    public void init()
    {       
        System.out.println("Applet Step1");
        String[] args = null;
        createAndShowGUI(args);      
    }
    private static void createAndShowGUI(String[] args) { /*code*/ }
    public MainFrame(final String[] args) {}
}
4

3 回答 3

6

您还需要添加一个默认构造函数...

public MainFrame() {}
于 2011-06-22T17:51:20.030 回答
3

您需要一个默认构造函数,因为您的类的实例将由浏览器本身实例化(或浏览器将此任务委托给 jre 的 appletviewer 或插件)。

由于浏览器对您的类一无所知,它在所有 Applet 类上工作的唯一方法是使用一组标准参数来实例化它们。而且,对于applet,这组参数很简单:一个空集。

所以,你需要在你的类中有一个默认的(没有参数)构造函数。

在那之后,@Rocky Triton 是对的:在 java 中,如果你没有在类中提供任何构造函数,java 将为它提供一个默认构造函数。但是,一旦您提供了构造函数,无论它是什么,java 都不再提供默认构造函数(正如您所说,在某种程度上,您将负责类的实例化)。

因此,在您的情况下,如果您决定提供带参数的构造函数,java 将不会提供默认构造函数,并且浏览器将无法实例化您的类。

问候, 斯蒂芬

于 2011-06-22T18:03:22.753 回答
0

我相信你也应该能够改变: public MainFrame(final String[] args) {}

至:公共 MainFrame(String... args) {}

这允许您不需要传入 args,因此它会构造它。

于 2018-10-26T15:12:50.187 回答