Java Staticについて

今回は、JavaのStatic変数のについて短くメモしていきたいと思います。

特徴

  • staticがついている変数やメソッドは全てのインスタンスが共有する。
  • プログラム起動時に1回のみ、メモリに割り付けられる。
  • クラス名前で直接に参照ができる。
    • Person.nameのようにインスタンス化をしなくても利用可能になる。
  • 静的ファクトリメソッドパターンやシングルトンパターンの構築に使われる。
  • Java8の以前にはPermang generation area領域に保存されたが、Java8以降にはMetaspaceに保存し、できるだけGCされるように最適化している。

Static変数

class NakamuraFamily {
    String lastname = "中村";
}

public class Sample {
    public static void main(String[] args) {
        NakamuraFamily nakamura1 = new NakamuraFamily();
        NakamuraFamily nakamura2 = new NakamuraFamily();
    }
}

上記は中村さんの家族のクラスです。上記のようにクラスを作成してしまうとオブジェクトが生成されるたびに「lastname」を保存するため、メモリがオブジェクトごとに割り付けれられます。

でも、中村さんの家族のクラスはどんなオブジェクトでも「lastname」が中村でならなければなりません。このように値が変わらない場合はstaticをつけるといいでしょう。

class NakamuraFamily {
    static String lastname = "中村";
}

public class Sample {
    public static void main(String[] args) {
        NakamuraFamily nakamura1 = new NakamuraFamily();
        NakamuraFamily nakamura2 = new NakamuraFamily();
    }
}

上記のように「static」をつけることで1回だけ、メモリに割り付けられます。

Staticメソッド

staticメソッド内ではオブジェクト変数を参照することができません。変数もstaticがついてなければなりません。

その理由は「static」がついている静的変数や静的メソッドはプログラムが起動時にメモリに割りつけれれ、オブジェクト変数やメソッドはインスタンス化されたらメモリに割り付けられるからです。

つまり、静的変数や静的メソッドとオブジェクト変数やメソッドがメモリに割り付けれられるタイミングが違う、静的変数や静的メソッドが割り付けられる時点ではオブジェクト変数やメソッドがメモリに割り付けられていないです。

静的メソッドはUtilクラスやヘルパークラスを作成時によく使われます。

シングルトンパターン

class Singleton {
    // 静的変数として定義したので、プログラム起動時に1回だけ、 メモリに割り付けられる。
    private static final instance = new Singleton();

    private Singleton() {
    }

    public static Singleton getInstance() {
        return instance;
    }
}

参照

https://wikidocs.net/228#static

https://syundev.tistory.com/222?category=870166

コメントを残す