• ベストアンサー

finalの意味

import javax.swing.*; import java.awt.*; import java.awt.event.*; public class ExerciseD8L1{ public static void main(String args[]){ final JFrame myFrame = new JFrame(); myFrame.getContentPane().setLayout(new BorderLayout()); final JLabel myLabel = new JLabel(); JPanel myPanel = new JPanel(); myFrame.getContentPane().add(myLabel,BorderLayout.CENTER); myFrame.getContentPane().add(myPanel,BorderLayout.NORTH); JButton btn1 = new JButton("btn1"); btn1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent ae){ myLabel.setText("btn1がクリックされました"); } }); }); myPanel.add(btn1); myFrame.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); } }); myFrame.setSize(400,100); myFrame.setVisible(true); } } これで、finalをつけないとコンパイルできません。 なぜ、fianlが必要なんでしょう。 どのようなときにfinalを用いるのでしょう。 お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Harry_
  • ベストアンサー率55% (36/65)
回答No.3

JFrame myFrame の前の final は必要ありません。 なくてもコンパイルできます。試してみてください。 JLabel myLabel の前の final は、 public void actionPerformed(ActionEvent ae){  myLabel.setText("btn1がクリックされました"); } というローカル内部クラス内で参照されているので、 final でなければならず、 そのより詳しい説明が(下手ですが) No.2 の回答です。

ballack
質問者

お礼

詳しい説明ありがとうございました。

その他の回答 (2)

  • Harry_
  • ベストアンサー率55% (36/65)
回答No.2

うまく説明できるかわかりませんが。 ローカル内部クラスからアクセスされる ローカル変数は final でなければならない、 ということになっています。 その理由は、ローカル変数はスコープを外れた時点で なくなってしまいますが、 それを利用しているローカル内部クラスのインスタンスは、 フィールドに代入するなり、メソッドの戻り値にするなり して、ずっと存続させることができるからです。 もしローカル内部クラスが参照しているローカル変数の 内容を変更できるとしたら、ローカル内部クラスが アクセスするローカル変数というのは、一体どの時点に おけるものなのか、と考えると、曖昧さを排除するには 変更不可能にするしかない、というのが何となくわかると思います。 多分バイトコードレベルでは、 ローカル内部クラスはローカル変数を参照しているのでは なく、直接その参照先の値を利用しているのだと思います。

ballack
質問者

お礼

JFrameとJLabelにはなぜfinalをつけなければならないのか、具体的に教えていただけるとより良かったのですが... まだまだ自分は勉強不足ですね。 回答ありがとうございました。

  • Sequel
  • ベストアンサー率41% (23/56)
回答No.1

Javaのプログラミングを行った事が無いので、まちがっているかもしれません。的外れでしたらごめんなさい…。 http://www2s.biglobe.ne.jp/~yuuki_ki/java_class12.htm 上記ページを参考にしました。 おそらく、質問のコードは「メンバ変数宣言時にfinalを使用」というケースに該当すると思います。 参照ページの説明によると、final修飾子をつけることによって、変数生成以降に異なる値が入ることを防いでいるっぽいです。 いろいろなケースでfinal修飾子をつけることがあるみたいですね。参考URLでは、まさにそのことについての記事が掲載されていますので、ご覧になってください。

参考URL:
http://www2s.biglobe.ne.jp/~yuuki_ki/java_class12.htm
ballack
質問者

お礼

JFrameとJLabelにはなぜfinalをつけなければならないのか、具体的に教えていただけるとより良かったのですが... まだまだ自分は勉強不足ですね。 回答ありがとうございました。