HOWTO · Java

Java の静的変数と最終変数の違い

これは、Java の静的変数と最終変数の違いを示しています。また、両方の変数の使用については、コード例を通じて説明します。

このチュートリアルでは、static キーワードと final キーワードの違いを示します。表形式と実際の例の違いについて説明しましょう。

static final
宣言中に静的変数を初期化する必要はありません。 宣言時に final 変数を初期化する必要があります。
静的変数は再初期化できます 最終変数を再初期化することはできません。
ネストされた静的クラス、変数、メソッド、およびブロックで使用されます。 これは、クラス、メソッド、および変数とともに使用されます。
静的メソッドは、他の静的メソッドからのみ呼び出すことができます。 最終メソッドをサブクラスでオーバーライドすることはできません。

Java の静的変数

静的変数またはメソッドを作成すると、オブジェクトではなくクラスにアタッチされます。変数またはメソッドは、プログラム全体で同じ参照を共有します。

次のプログラムには、静的変数 numdummyMethod() と呼ばれる static メソッドを含むクラス DummyClass があります。別のクラスからこれら 2つのメンバーにアクセスするために、これらは静的であるため、DummyClass のオブジェクトを作成することはできません。

クラス名を使用して直接呼び出します。

例:

public class ExampleClass3 {
  public static void main(String[] args) {
    DummyClass.num = 5;
    System.out.println("Static variable value: " + DummyClass.num);
    DummyClass.dummyMethod();
  }
}

class DummyClass {
  public static int num = 0;

  public static void dummyMethod() {
    System.out.println("Inside Static Dummy Method");
  }
}

出力:

Static variable value: 5
Inside Static Dummy Method

外部クラスを参照せずに static キーワードを使用してネストされたクラス。static キーワードを使用して、クラス内に内部クラスを作成できます。

次の例では、クラス DummyClass があり、その中に InnerClass という静的クラスを作成し、このクラスでメソッド dummyMethod() を作成します。

ここで、ExampleClass3 クラスで、DummyClass.InnerClass を使用して InnerClass を取得し、DummyClass クラスのオブジェクトを作成して、dummyMethod() 関数を呼び出します。

例:

public class ExampleClass3 {
  public static void main(String[] args) {
    DummyClass.InnerClass dummyClassObj = new DummyClass.InnerClass();
    dummyClassObj.dummyMethod();
  }
}

class DummyClass {
  static class InnerClass {
    void dummyMethod() {
      System.out.println("Inside Static Dummy Method Of The Inner Static Class");
    }
  }
}

出力:

Inside Static Dummy Method Of The Inner Static Class

Java の最終変数

最終変数は、初期化されると変更できません。この例は、final 変数を作成してから再初期化しようとすると、出力にエラーが発生することを示しています。

public class ExampleClass3 {
  public static void main(String[] args) {
    final int num = 0;
    num = 1;
  }
}

出力:

java: cannot assign a value to final variable num

別のクラスは final クラスを拡張できません。クラスの作成中に final キーワードを使用すると、そのクラスが他のクラスに継承されないように制限されます。

例:

public class ExampleClass3 {
  public static void main(String[] args) {
    new DummyClass().dummyMethod();
  }
}

final class DummyClass {
  public void dummyMethod() {
    System.out.println("Inside Static Dummy Method");
  }
}

class DummyClass2 extends DummyClass {
  public void dummyMethod2() {
    System.out.println("Inside Static Dummy Method 2");
  }
}

出力:

java: cannot inherit from final com.tutorial.DummyClass

サブクラスの final メソッドをオーバーライドすることはできません。最終クラスと同様に、関数が final キーワードを使用する場合、そのサブクラスでオーバーライドすることはできません。

public class ExampleClass3 {
  public static void main(String[] args) {
    new DummyClass2().dummyMethod();
  }
}

class DummyClass {
  public final void dummyMethod() {
    System.out.println("Inside Static Dummy Method");
  }
}

class DummyClass2 extends DummyClass {
  public void dummyMethod() {
    System.out.println("Inside Overridden Dummy Method");
  }
}

出力:

java: dummyMethod() in com.tutorial.DummyClass2 cannot override dummyMethod() in com.tutorial.DummyClass
 overridden method is final