Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > Java基本 > クラス −12.final
更新日:2011/8/16
クラス−12.final
このページではfinal修飾子について説明します。
概要

final修飾子はクラス、メソッド、メンバ変数の宣言時に付与することができます。以下ではそれぞれのケースにおいてfinal修飾子の説明をします。

クラス宣言時にfinalを使用

final修飾子を付与してクラスを宣言するとそのクラスはサブクラスで継承できなくなります。finalを使用する理由の一つとしてセキュリティ上の問題があります。プログラムに不正動作を与えようとするハッカーたちの一つの手段としてあるクラスのサブクラスを作成し、そのサブクラスに不正な動作を行う処理を記述すると言うものがあります。サブクラスを作成することにより、スーパークラスで想定される動作とはまったく異なる動作を行おうとするのです。

また、もう一つの理由としてオブジェクト設計の観点から、サブクラスを作る必要がないと明示的に宣言しておきたい場合にも使用します。

【例1finalが付与されたクラスを継承する例です。

final class ExClass15 {
  //スーパークラスExClass15
}

class subExClass15 extends ExClass15 {
  //スーパークラスExClass15をサブクラスsubExClass15で継承
  //ExClass15はfinalが付与されているため継承できない
}
【実行結果1】
D:\JAVA>javac subExClass15.java
subExClass15.java:5: final ExClass15 からは継承できません。
class subExClass15 extends ExClass15 {     ↑ コンパイルエラー
                   ^
エラー 1 個

D:\JAVA>
メソッド宣言時にfinalを使用

final修飾子を付与してメソッドを宣言するとそのメソッドはサブクラスでオーバーライドできなくなります。クラス全体を継承できなくすると都合が悪い場合に使用します。

【例2finalが付与されたメソッドをオーバーライドする例です。

class ExClass16 {
  final void show() {
    //スーパークラスのshowメソッド
  }
}
class subExClass16 extends ExClass16 {
  final void show() {
    //スーパークラスのshowメソッドをオーバーライド
  }
}
【実行結果2】
D:\JAVA>javac subExClass16.java
subExClass16.java:8: subExClass16 の show() は ExClass16 の show() をオーバーラ イドできません。; オーバーライドされたメソッドは final です。
final void show( ) {    ↑オーバーライドしたことによるコンパイルエラー
        ^
エラー 1 個

D:\JAVA>
メンバ変数宣言時にfinalを使用

final修飾子を付与してメンバ変数を宣言するとそのメンバ変数は定数として扱われます。finalが付与されたメンバ変数に一度値を代入するとその値を変更することはできません。

finalをint、doubleなどの基本型(プリミティブ型)の変数に利用した場合は特に問題はありませんが、オブジェクト型(参照型)の変数に利用した場合は注意点があります。オブジェクト型変数の参照情報を変更することはできませんが、オブジェクト型変数を通してそのオブジェクト自体の値は変更できると言う点です。

【例3オブジェクト型変数にfinalを使用した例です。

class ExClass17 {
  private int value;
  //コンストラクタ、メンバ変数valueを初期化
  ExClass17(int value) {
    this.value = value;
  }
  public static void main(String[ ] args) {
    final ExClass17 object1 = new ExClass17(100);  //(1)
                  //object1 = new ExClass17(200);  //(2)

    object1.value = 200;  //(3)
    System.out.println("valueの値は" + object1.value);  //(4)
  }
}

【解説3】

(1). final修飾子を付与してExClass17クラスのオブジェクト変数object1を宣言・生成。オブジェクト参照情報を代入。
(2). final修飾子が付与されたオブジェクト型変数object1に新しくオブジェクトを生成し、オブジェクト参照情報を代入しようとするとコンパイルエラーになります。
(3). オブジェクト型変数object1を通して、オブジェクトの構成要素メンバ変数valueの値の変更を行います。オブジェクトの値自体は変更できます。
(4). 変更されたメンバ変数valueの値の表示を行います。
【実行結果3】
D:\JAVA>javac ExClass17.java

D:\JAVA>java ExClass17
valueの値は200

D:\JAVA>



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道