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

Javaのデフォルトコンストラクタで静的変数を初期化できる?static finalとの違いも解説

静的変数(クラス変数)とは

クラス変数(静的変数)はクラスに属する変数です。インスタンス変数と同様に、クラス内のメソッドの外で宣言しますが、その際にstaticキーワードを付けます。

静的変数はコンパイル時からアクセス可能で、クラスをインスタンス化する前でも、そもそもインスタンスを作成しなくてもアクセスできます。また、静的フィールドはクラス全体で1つのコピーしか存在しないため、すべてのオブジェクトで値が共有され、どのオブジェクトから参照しても常に同じ値になります。

静的フィールドはstaticキーワードを使って定義します。クラス内で静的変数を宣言しても明示的に初期化しなかった場合、インスタンス変数と同じように、型に応じたデフォルト値(数値型なら0、boolean型ならfalse、参照型ならnull)が自動的に割り当てられます。

コンストラクタで静的変数を初期化できるか?

結論から言えば、静的変数もコンストラクタで初期化できます。次の例では、コンストラクタ内で静的変数nameageに値を代入しています。

サンプルコード

public class DefaultExample {
    static String name;
    static int age;
    DefaultExample() {
        name = "Krishna";
        age = 25;
    }
    public static void main(String args[]) {
        new DefaultExample();
        System.out.println(DefaultExample.name);
        System.out.println(DefaultExample.age);
    }
}

実行結果

Krishna
25

staticとfinalを組み合わせた場合の注意点

ただし、変数をstaticかつfinalで宣言した場合は事情が異なります。final変数は一度値を代入すると二度と変更できないため、Javaコンパイラはデフォルトコンストラクタでfinal変数を初期化しません。そのため、static final変数は宣言時または静的初期化ブロック(staticブロック)で必ず初期化しなければなりません。初期化を怠ると、コンパイル時エラーが発生します。

サンプルコード

public class DefaultExample {
    static final String name;
    static final int age;
    public static void main(String args[]) {
        new DefaultExample();
        System.out.println(DefaultExample.name);
        System.out.println(DefaultExample.age);
    }
}

コンパイルエラー

DefaultExample.java:2: error: variable name not initialized in the default constructor
    static final String name;
                        ^
DefaultExample.java:3: error: variable age not initialized in the default constructor
    static final int age;
                     ^
2 errors

さらに、static finalとして宣言した変数に対してコンストラクタ内で値を代入しようとすると、コンパイラはそれを「final変数への代入の試み」とみなし、コンパイル時エラーを出力します。

サンプルコード

public class DefaultExample {
    static final String name;
    static final int age;
    DefaultExample() {
        name = "Krishna";
        age = 25;
    }
    public static void main(String args[]) {
        new DefaultExample();
        System.out.println(DefaultExample.name);
        System.out.println(DefaultExample.age);
    }
}

コンパイルエラー

DefaultExample.java:5: error: cannot assign a value to final variable name
    name = "Krishna";
          ^
DefaultExample.java:6: error: cannot assign a value to final variable age
    age = 25;
         ^
2 errors

まとめ

  • 通常の静的変数は、コンストラクタで初期化することも可能です。
  • 明示的に初期化しなかった静的変数には、型ごとのデフォルト値が自動的に割り当てられます。
  • static final変数はデフォルトコンストラクタで初期化されないため、宣言時またはstaticブロックでの初期化が必須です。
  • static final変数へのコンストラクタからの代入は、コンパイルエラーになります。
  1. Javaのインターフェース変数が暗黙的にstaticかつfinalになる理由を解説

    Javaにおいて、インターフェース内で宣言された変数は、明示的に修飾子を指定しなくても、自動的に public static final として扱われます。なぜこのような仕様になっているのか、その理由を詳しく見ていきましょう。 インターフェースとは何か インターフェースは「振る舞いのプロトコル(契約)」を定義するものであり、具体的な実装方法を規定するものではありません。インターフェースを実装するクラスは、そのインターフェースで定められたプロトコルに従うことを約束します。 つまり、インターフェースはオブジェクトの設計図としての役割を持ち、実装の詳細ではなく「何ができるか」を宣言する場所です。こ

  2. Javaでブランクfinal変数(空白final変数)は初期化できる?

    結論:はい、初期化できます Javaでは、宣言時に値を代入しない「ブランクfinal変数(空白final変数)」を作成することができます。ただし、final変数である以上、使用する前に必ず一度だけ初期化しなければなりません。 この初期化は、次のいずれかの場所で行うことができます。 コンストラクタ インスタンス初期化ブロック 1. コンストラクタで初期化する方法 最も一般的なのは、コンストラクタ内で値を代入する方法です。オブジェクト生成時に引数として渡した値を、final変数に設定できます。 public class Sample { // ブランクfinal変数(宣言時には初期化