Java接口可以有构造函数吗?

时间:2012-08-23 16:22:01

标签: java interface

ActionListener是一个接口,但为什么我可以创建实例对象?

   JButton button = new JButton("Button1");

   ActionListener me = new ActionListener(){
        public void actionPerformed(ActionEvent ae){
            JOptionPane.showMessageDialog(null,ae.getActionCommand());  
        }
    };
    button.addActionListener(me);

还是还有什么?我不确定。请帮帮我。

9 个答案:

答案 0 :(得分:6)

您在此处看到的内容称为匿名类:me将分配一个实现ActionListener接口的匿名(未命名)类的实例。

答案 1 :(得分:4)

与C#不同,Java的接口不能规定构造函数。

您在代码中所做的是创建一个扩展java.lang.Object(具有默认构造函数)并实现接口的匿名类。

答案 2 :(得分:2)

您实例化的是Anonymous Inner Class。简而言之,它是一种内联方式,既可以定义一个没有名称的类,也可以在一个语句中实例化该类的实例。您只能通过他们实现或扩展的超类来引用匿名内部类。对于这个问题,超类是ActionListener接口。

编译代码时,会有一个额外的.class文件,其名称如下:OuterClass$1.class。这是表示您定义的匿名内部类的类文件。

如果您想了解更多信息,请查看JLS http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.9.5

中的此部分

答案 3 :(得分:1)

因为您正在使用匿名类实现接口

答案 4 :(得分:1)

ActionListener本身就是一个界面。

但是,代码中的构造是一个匿名内部类,这意味着您的接口是由该内部类实现的。

答案 5 :(得分:1)

实际上,您正在创建的是Object.class的匿名子类,它实现了接口。所以你从Object“继承”Constructor,而不是从接口继承。

答案 6 :(得分:1)

您没有创建ActionListener的实例。您正在创建一个实现ActionListener的匿名类,并且您正在提供该实现。

答案 7 :(得分:1)

ActionListener实际上是一个无法实例化的接口。

但是,通过在本地定义public void actionPerformed(),您可以让接口像一个类一样运行。

这是合法的:

 ActionListener me = new ActionListener(){
      public void actionPerformed(...){...};
 };

这不是:

ActionListener me = new ActionListener();

答案 8 :(得分:0)

1。

} {/ 1}}中<{1}}

2。您在此处看到的是constructor同时声明并初始化,并且必须扩展或实施课程或界面分别