みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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を用いるのでしょう。
お願いします。

投稿日時 - 2003-05-26 19:45:48

QNo.558169

すぐに回答ほしいです

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

JFrame myFrame の前の final は必要ありません。
なくてもコンパイルできます。試してみてください。

JLabel myLabel の前の final は、

public void actionPerformed(ActionEvent ae){
 myLabel.setText("btn1がクリックされました");
}

というローカル内部クラス内で参照されているので、
final でなければならず、
そのより詳しい説明が(下手ですが) No.2 の回答です。

投稿日時 - 2003-05-29 01:48:17

お礼

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

投稿日時 - 2003-05-29 15:04:12

ANo.3

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

うまく説明できるかわかりませんが。

ローカル内部クラスからアクセスされる
ローカル変数は final でなければならない、
ということになっています。

その理由は、ローカル変数はスコープを外れた時点で
なくなってしまいますが、
それを利用しているローカル内部クラスのインスタンスは、
フィールドに代入するなり、メソッドの戻り値にするなり
して、ずっと存続させることができるからです。

もしローカル内部クラスが参照しているローカル変数の
内容を変更できるとしたら、ローカル内部クラスが
アクセスするローカル変数というのは、一体どの時点に
おけるものなのか、と考えると、曖昧さを排除するには
変更不可能にするしかない、というのが何となくわかると思います。

多分バイトコードレベルでは、
ローカル内部クラスはローカル変数を参照しているのでは
なく、直接その参照先の値を利用しているのだと思います。

投稿日時 - 2003-05-26 20:59:35

お礼

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

投稿日時 - 2003-05-28 15:15:31

ANo.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

投稿日時 - 2003-05-26 20:03:18

お礼

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

投稿日時 - 2003-05-28 15:15:00

あなたにオススメの質問