匿名クラスを利用した直接newインタフェースオブジェクト
7766 ワード
今日GUIを勉強している時に、Buttonにリスニングを追加した時、こんなコードに気づきました.
直接
Javaの内部でいくつかの変更が行われていることがわかります.
ソースファイルのコード:
button.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent arg0) {
System.out.println(" ");
}
});
直接
new
のMouseWheelListener
インタフェースであることがわかり、なぜ直接new
インタフェースができるのか悩んでいます.インタフェースは、bin
ディレクトリの下に生成された.class
ファイルのうち、このようなファイルDemo$1.class
が1つ多く、ソースファイルがDemo.class
であることをnewで直接操作した.Demo$1.class
を開くと、new
のインタフェースに対応するプログラムが書かれていることがわかります.// Compiled from Demo.java (version 1.7 : 51.0, super bit)
class com.guigu.event.Demo$1 implements java.awt.event.MouseWheelListener {
// Field descriptor #8 Lcom/guigu/event/Demo;
final synthetic com.guigu.event.Demo this$0;
// Method descriptor #10 (Lcom/guigu/event/Demo;)V
// Stack: 2, Locals: 2
Demo$1(com.guigu.event.Demo arg0);
0 aload_0 [this]
1 aload_1 [arg0]
2 putfield com.guigu.event.Demo$1.this$0 : com.guigu.event.Demo [12]
5 aload_0 [this]
6 invokespecial java.lang.Object() [14]
9 return
Line numbers:
[pc: 0, line: 1]
[pc: 5, line: 16]
Local variable table:
[pc: 0, pc: 10] local: this index: 0 type: new com.guigu.event.Demo(){}
// Method descriptor #22 (Ljava/awt/event/MouseWheelEvent;)V
// Stack: 2, Locals: 2
public void mouseWheelMoved(java.awt.event.MouseWheelEvent arg0);
0 getstatic java.lang.System.out : java.io.PrintStream [23]
3 ldc " "> [29]
5 invokevirtual java.io.PrintStream.println(java.lang.String) : void [31]
8 return
Line numbers:
[pc: 0, line: 19]
[pc: 8, line: 20]
Local variable table:
[pc: 0, pc: 9] local: this index: 0 type: new com.guigu.event.Demo(){}
[pc: 0, pc: 9] local: arg0 index: 1 type: java.awt.event.MouseWheelEvent
Inner classes:
[inner class info: #1 com/guigu/event/Demo$1, outer class info: #0
inner name: #0, accessflags: 0 default]
Enclosing Method: #42 #44 com/guigu/event/Demo.init()V
}
Javaの内部でいくつかの変更が行われていることがわかります.
new
のオブジェクトは実際にはInner classes
に作成されています.これにより、確かに操作が簡略化されます.ソースファイルのコード:
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
public class Demo {
public Demo(){
init();
}
public void init(){
Frame frame = new Frame();
frame.setVisible(true);
Button button = new Button("test");
button.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent arg0) {
System.out.println(" ");
}
});
frame.add(button);
frame.pack();
}
public static void main(String[] args) {
new Demo();
}
}