ActionListener是一个接口,但为什么我可以创建实例对象?
JButton button = new JButton("Button1");
ActionListener me = new ActionListener(){
public void actionPerformed(ActionEvent ae){
JOptionPane.showMessageDialog(null,ae.getActionCommand());
}
};
button.addActionListener(me);
还是还有什么?我不确定。请帮帮我。
答案 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
,同时声明并初始化,并且必须扩展或实施课程或界面分别。