Java接口可以有构造函数吗?
ActionListener是一个接口,但为什么我可以创建实例对象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());
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中的事件是否具有多态性的特征?