匿名クラスを利用した直接newインタフェースオブジェクト

7766 ワード

今日GUIを勉強している時に、Buttonにリスニングを追加した時、こんなコードに気づきました.
button.addMouseWheelListener(new MouseWheelListener() {
            @Override
            public void mouseWheelMoved(MouseWheelEvent arg0) {
                System.out.println(" ");
            }
        });

直接newMouseWheelListenerインタフェースであることがわかり、なぜ直接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();
    }
}