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

Javaにおける静的変数(static変数)と非静的変数(インスタンス変数)の違いを徹底解説

変数とは、プログラムが操作できる名前付きの記憶領域のことです。Javaの各変数には必ず特定の型が存在し、その型によって以下の要素が決まります。

  • 変数のメモリサイズとレイアウト
  • そのメモリに格納できる値の範囲
  • 変数に対して適用できる演算の種類

Javaの変数は大きく「静的変数(static変数)」と「非静的変数(インスタンス変数)」の2種類に分けられます。それぞれの特徴を見ていきましょう。

静的変数(Static Variable)とは

静的変数は「クラス変数」とも呼ばれ、クラスのすべてのオブジェクト(インスタンス)で共通して使われる変数です。インスタンスを生成しなくても、クラス名を指定することで直接アクセスできます。

public static int staticCounter = 0;

非静的変数(Non-Static Variable)とは

クラス内で宣言された変数のうち、staticキーワードが付いていないものを「非静的変数」または「インスタンス変数」と呼びます。この変数は、オブジェクトを生成したタイミングで個別に作成され、各インスタンスごとに独立した値を持ちます。

静的変数と非静的変数の主な違い

両者の違いを、アクセス・共有・メモリ割り当て・キーワードの観点から整理すると次の表のようになります。

No.項目静的変数(static)非静的変数(インスタンス変数)
1アクセス静的メンバーだけでなく、非静的メンバーメソッドからもアクセス可能です。静的メンバーメソッドからはアクセスできません。
2共有グローバル変数のように振る舞い、クラスのすべてのオブジェクト間で共有されます。生成されたインスタンスオブジェクトごとに固有の値を持ちます。
3メモリ割り当て占有する領域が小さく、メモリへの割り当ては一度だけ行われます。より多くのメモリを消費する場合があります。割り当ては実行時に行われます。
4キーワード宣言時にstaticキーワードが必要です。特別なキーワードは不要です。

静的変数と非静的変数の動作確認サンプルコード

実際のコードで両者の挙動の違いを確認してみましょう。

JavaTester.java

public class JavaTester {
    public int counter = 0;
    public static int staticCounter = 0;
    public JavaTester(){
        counter++;
        staticCounter++;
    }
    public static void main(String args[]) {
        JavaTester tester = new JavaTester();
        JavaTester tester1 = new JavaTester();
        JavaTester tester2 = new JavaTester();
        System.out.println("Counter: " + tester2.counter);
        System.out.println("Static Counter: " + tester2.staticCounter);
    }
}

実行結果

Counter: 1
Static Counter: 3

この実行結果から、重要なポイントが読み取れます。

  • counter(非静的変数): インスタンスごとに独立しているため、tester2自身のコンストラクタで1回だけインクリメントされた値「1」が出力されます。
  • staticCounter(静的変数): 3つのインスタンスすべてで共有されているため、コンストラクタが合計3回実行された結果「3」が出力されます。

このように、静的変数はクラス全体で1つだけ存在するのに対し、非静的変数はインスタンスごとに個別のコピーが作られる点が最大の違いです。カウンターのような共有データには静的変数を、オブジェクトごとの状態管理には非静的変数を使うのが適切です。

  1. Javaの静的ブロックとコンストラクターの違いとは?実行タイミングと使い分けを徹底解説

    Javaには、クラスやオブジェクトの初期化に関わる仕組みとして「静的ブロック(staticブロック)」と「コンストラクター」があります。どちらも初期化処理を記述するために使われますが、実行されるタイミングや役割が大きく異なります。本記事では、それぞれの特徴と違いをコード例とともに詳しく解説します。 静的ブロック(staticブロック)とは 静的ブロックはクラスがロードされるタイミングで実行されます。 main()メソッドよりも先に実行されます。 静的ブロックには名前がなく、引数や戻り値も持ちません。 クラスロード時に一度だけ実行したい処理(静的変数の初期化など)は、静的ブロック内に記述しま

  2. Javaのimport文とstatic import文の違いをわかりやすく解説

    Javaでは、import文を使うことで、特定のパッケージに属するクラスやインターフェースを取り込むことができます。import文を使用すれば、毎回完全修飾名(FQCN)を記述する必要がなく、クラス名だけで直接コードに書けるようになります。一方、static import文は、特定のクラスやパッケージからstaticメンバー(静的メンバー)をインポートするための構文です。static importを使えば、staticメンバーへアクセスする際にクラス名を指定する必要がなくなり、メンバー名を直接記述できるようになります。import文の基本別パッケージのクラスやメソッドにアクセスするには、完全修