Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaでコンストラクターにfinalを付けられないのはなぜ?理由とエラー例を解説

Javaでメソッドにfinalを付けると、そのメソッドはオーバーライドできなくなります。つまり、サブクラス側でスーパークラスのfinalメソッドを再定義し、独自の実装を与えることはできません。

メソッドをfinalにする本来の目的は、子クラスなど外部からの変更を防ぎ、動作を固定することにあります。

コンストラクターは継承されない

継承の仕組みでは、サブクラスはスーパークラスのほぼすべてのメンバーを受け継ぎますが、コンストラクターだけは例外です。言い換えると、Javaにおいてコンストラクターは継承されないため、コンストラクターをオーバーライドすること自体が不可能です。

finalの役割は「オーバーライドの禁止」である以上、そもそもオーバーライドされ得ないコンストラクターにfinalを指定しても何の意味もありません。このため、Javaではコンストラクターの前にfinalキーワードを記述することが言語仕様として許可されていません。

仮にコンストラクターをfinalにしようとすると、コンパイル時に「modifier final not allowed here(ここではfinal修飾子は使用できません)」というコンパイルエラーが発生します。

コード例

次のJavaプログラムでは、Studentクラスのコンストラクターに誤ってfinalを指定しています。

public class Student {
    public final String name;
    public final int age;
    public final Student() {
        this.name = "Raju";
        this.age = 20;
    }
    public void display() {
        System.out.println("Name of the Student: "+this.name );
        System.out.println("Age of the Student: "+this.age );
    }
    public static void main(String args[]) {
        new Student().display();
    }
}

コンパイルエラー

このプログラムをコンパイルすると、以下のようなエラーが出力されます。

Student.java:6: error: modifier final not allowed here
    public final Student(){
                 ^
1 error

まとめ

  • finalはメソッドのオーバーライドを禁止するための修飾子である。
  • コンストラクターは継承されないため、オーバーライドという概念が存在しない。
  • したがって、コンストラクターにfinalを付けることは意味がなく、Javaではコンパイルエラーとなる。
  1. Javaのfinal変数とは?使い方と定数宣言の基本を解説

    Javaにおけるfinal変数は、明示的な初期化を一度しか行えない変数です。一度値を代入すると、その後は再代入することができません。 また、参照型変数にfinalを付けた場合、その参照先のオブジェクトを別のオブジェクトに変更することはできません。ただし、オブジェクト内部のデータ(フィールドの値など)は変更可能です。つまり、オブジェクトの状態は変更できるが、参照自体は変更できないという点に注意が必要です。 final修飾子とstaticの組み合わせ 変数に対してfinal修飾子を使用する場合、多くの場面でstaticキーワードと組み合わせて使われます。これにより、定数がクラス変数(クラス全体で共

  2. Javaのfinalキーワードとは?変数・メソッド・クラスでの使い方を解説

    finalは、Javaにおける非アクセス修飾子のひとつです。クラス、メソッド、変数の実装を「確定」させるために使用され、これらが後から変更されることを防ぐ役割を持ちます。本記事では、finalキーワードの基本的な概念と、変数・メソッド・クラスそれぞれでの使い方をコード例とともに解説します。final変数final変数は、明示的に初期化できるのは一度だけです。また、finalで宣言された参照変数は、別のオブジェクトを参照するように再代入することはできません。ただし、オブジェクト内部のデータ自体は変更可能です。つまり、オブジェクトの「状態」は変えられるものの、「参照先」は変えられないという点に注意