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

Java接口可以有构造函数吗?,java,interface,Java,Interface,ActionListener是一个接口,但为什么我可以创建实例对象 JButton button = new JButton("Button1"); ActionListener me = new ActionListener(){ public void actionPerformed(ActionEvent ae){ JOptionPane.showMessageDialog(null,ae.getActionCommand());

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

   JButton button = new JButton("Button1");

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

或者别的什么?我不确定。请帮帮我。

您在这里看到的是一个匿名类:
me
将被分配一个匿名(未命名)类的实例,该类实现了
ActionListener
接口。

因为您是用匿名类实现接口的。

与C不同,Java的接口不能指定构造函数


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

ActionListener
本身确实是一个接口


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

实际上,您创建的是实现接口的
对象.class
的匿名子类。因此,您是从对象而不是从接口“继承”构造函数。

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

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

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


如果您想了解更多信息,请查看JLS中的本节,ActionListener实际上是一个无法实例化的接口

但是,通过在本地定义public void actionPerformed(),可以使接口像类一样工作

这是合法的:

 ActionListener me = new ActionListener(){
      public void actionPerformed(...){...};
 };
这不是:

ActionListener me = new ActionListener();

1.您不能在java的
接口中拥有
构造函数


2.您在这里看到的是一个
匿名类
,它是同时声明和初始化的,它必须分别扩展或实现一个类或接口

和一个以上,先生。我能说java中的事件实现多态性吗?@kimleng:我甚至不知道你的意思。对不起,先生,我的英语很差。我的意思是,Java中的事件是否具有多态性的特征?