InnerClassが参照する外層local final変数は、いったいどんな意味を持っているのか.


まず、このコードを見てください.

public class ShowAnonymousClass extends JFrame {

    Button myButton;

    int count;

    public ShowAnonymousClass() {
        super("Inner Class Frame");
        myButton = new Button("click me");
        final TextArea myTextArea = new TextArea(); // 
        getContentPane().add(myButton, BorderLayout.CENTER);
        getContentPane().add(myTextArea, BorderLayout.NORTH);
        myButton.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent event){
                count++;
                myTextArea.setText("button clicked: " + count + " times");
            }
        });
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        ShowAnonymousClass mainFrame = new ShowAnonymousClass();
        mainFrame.setSize(300,300);
        mainFrame.setVisible(true);
    }
}

簡単な例として、匿名クラスを使用してbuttonのイベントを処理し、本来は匿名クラスで上位のfinal変数しか参照できないことに慣れていたが、突然、コンストラクション関数ShowAnonymousClassの実行が完了すると、myTextAreaというlocal変数は失効するはずだと考えられた.ボタンをクリックすると、なぜmyTextArea変数がTextAreaオブジェクトへの応用に有効なのか.final変数の具体的な意味はいったい何なのか、googleは、final変数の値や引用だけでは変えられないという説ばかりで、javaの文法規範を調べても見つからない.閉包に似ているのではないでしょうか.