Java staticメソッドとstaticフィールドの意味と使い方

Javaのstatic修飾子の意味がわからないあなたへ。この記事では、staticメソッドとstaticフィールドの使い方をサンプルを交えてご紹介しています。これを見れば、Javaのstaticが使いこなせるようになります。

staticの意味

通常、クラスからインスタンスを複数作ると、クラスに含まれる変数の実体も複数作成されます。静的変数とはそのクラスにひとつだけ存在する変数です。 インスタンスを複数作っても、静的変数はひとつだけとなります。また、静的変数はインスタンス化しなくても使用することができます。 変数を静的変数とするには、変数宣言の前に static を付けます。

staticメソッド

静的メソッドはクラスをインスタンス化しなくても呼び出すことのできるメソッドです。 静的でないメソッドはクラスをインスタンス化しないと呼び出すことはできません。 メソッドを静的メソッドとするには、メソッド宣言の前に static を付けます。

静的メソッドには次の制限があります。

静的メソッドはインスタンス化されずに呼び出されることがあるので、インスタンス化されないと領域が確保されないインスタンス変数を参照することができません。

class MyClass {
  static boolean staticVariable;
  boolean instanceVariable;

  static void MyFunc() {
    staticVariable = true;

    // staticでない変数は参照できない
    // instanceVariable = true;
  }
}

静的初期化ブロック

静的初期化ブロックとは、クラスのロード時に一度だけ実行されるコードブロックである。次のようにstatic修飾子を付けたブロックで表現する。

static { statements }

静的初期化ブロックの使用例を次に示す。

package com.fc2web.itref;

import java.util.Random;

class Foo {
  static int bar;

  static {
    Random r = new Random();
    bar = r.nextInt(100);
  }

  public int getBar() {
    return bar;
  }
}

static final

Javaにおいてfinal修飾子を指定した変数は、値を再代入できない。さらに、static修飾子を指定すると、クラスのインスタンスを作らずに使用できるようになる。

public class Example {
  public static final double PI = 3.14;
}

この定数は、次のように使用できる。

double x = Example.PI * 2

staticイニシャライザ

Javaにおけるstaticイニシャライザとは、クラスのロード時に一度だけ実行されるコードブロックのことである。

コンストラクタはインスタンス化しないと呼ばれないが、staticイニシャライザはクラスをインスタンス化しなくても実行される点が異なる。

class Example {
  static int x;
  int y;

  // staticイニシャライザ
  static {
    x = 1;
  }

  // コンストラクタ
  Example() {
    y = 2;
  }
}

static import

通常、static変数やstaticメソッドを利用する場合、クラス名で修飾する必要がある。

class Example {
  public double example(double x) {
    return Math.sin(Math.PI * x);
  }
}

static import文で変数やメソッドをインポートすると、クラス名で修飾せずに変数やメソッドを使用できる。

static import java.lang.Math.sin;
static import java.lang.Math.PI;

class Example {
  public double example(double x) {
    return sin(PI * x);
  }
}

static import文でパッケージごとインポートすることもできる。

static import java.lang.Math.*;

class Example {
  public double example(double x) {
    return sin(PI * x);
  }
}

static内部クラス

内部クラスにstatic修飾子を付けると、staticメソッドから利用できるようになる。

public class Foo {
  public static class Bar {
    private int x;
    public void setX(int a) {
      x = a;
    }
  }
}