HOME > final修飾子

final修飾子

英単語"final"には「最後の」とか「最終の」といった意味がありますが、final修飾子はまさにそんな感じの動作を与える修飾子です。

final修飾子は、クラス、メソッド、変数に指定することができ、それぞれ以下のような意味になります。

【final修飾子の動き】
 [クラスに付けた場合]:そのクラスは継承不可となる
 [メソッドに付けた場合]:そのメソッドはオーバーライド不可となる
 [変数に付けた場合]:その変数は変更不可(定数)となる

サンプルソース

例)final修飾子をクラスに指定した場合

SampleClass1.java
final public class SampleClass1 {    //finalはpublicの前後どちらでもOKです。

    public void hoge1(){
        System.out.println("TEST");
    }
}

SampleClass2.java
public class SampleClass2 extends SampleClass1{  //エラーになります。

    public void hoge2(){
        System.out.println("TEST");
    }
}

SampleClass2はfinal指定されたクラスを継承しているため例外が発生します。



例)final修飾子をメソッドに指定した場合

SampleClass1.java
public class SampleClass1 {

    //final指定したメソッド
    final public void hoge(){    //finalはpublicの前後どちらでもOKです。
        System.out.println("TEST");
    }
}

SampleClass2.java
public class SampleClass2 extends SampleClass1{

    //オーバーライド
    public void hoge(){  //エラーになります。
        System.out.println("TEST");
    }
}

hogeメソッドは final指定されているため、オーバーライドできずエラーとなります。



例)final修飾子を変数に指定した場合

SampleClass.java
public class SampleClass {

    //メンバ変数
    final public String str1 = "test";  //final指定したら初期値の指定は必須
    //final public String str2;           ←初期値を指定しないとエラーです

    //メソッド
    public void hoge(){

        final String str3 = "てすと";  //ローカル変数にも指定可能

        str1 = "TEST";  //final指定した変数に値の代入は不可。
        str3 = "TEST";  //final指定した変数に値の代入は不可。

    }
}

メンバ変数に「public static final」を指定をすると、グローバルな定数にすることができます。