staticフィールドとは?超初心者のJavaの勉強

2020-08-10

staticフィールドとは、インスタンスを生成しなくても利用できるフィールド(変数)です。静的フィールドとも呼ばれます。

初心者の身としてはインスタンスもよくわからないしで教材を読んでもよくわからなかったのですが言い換えると、オブジェクトのインスタンスを生成しなくてもフィールドへアクセスできるようになります。

staticフィールドと区別してインスタンスを生成するフィールドをインスタンスフィールドと言ったりもします。

staticフィールド宣言方法

staticフィールド宣言方法は下記になります。

アクセス修飾子 static 型名 変数
または  static アクセス修飾子 型名 変数

staticフィールドへのアクセス

staticフィールドへアクセスするには下記のように書きます。

クラス名.フィールド名
またはインスタンスを生成し呼び出すことも可能
インスタンス名.フィールド名
※インスタンス名.フィールド名はコンパイル時にクラス名.フィールド名もコードに置き換えられます。

しかし、それだとインスタンスフィールドと呼び出し方が同じになり、ややこしいのでstaticにアクセスする際はクラス名.フィールド名が好まれます。

staticフィールドの宣言と利用のサンプルコード

staticフィールドはインスタンス間で共有されます。

例1 staticフィールドはインスタンス間で共有される

public class Main {
    public static void main(String[] args) throws Exception {

        //オブジェクトStaticExpのインスタンス生成
        StaticExp instance1 = new StaticExp();
        StaticExp instance2 = new StaticExp();

        //変更前の値の確認
        System.out.println(instance1.str); //null
        //staticフィールドを利用して値を変更
        instance1.str = "haha";

        //instance1にもinstance2にもstaticフィールドは共有されるため
       //instance2の値は変更していないが結果はどちらもhahaとなります
        System.out.println(instance1.str); // haha
        System.out.println(instance2.str); //haha

        //インスタンスフィールドを利用して値を変更
        instance1.normalStr = "hehe";
       //結果はstaticフィールドと異なりインスタンスごとに異なる
       System.out.println(instance1.normalStr); // hehe
       System.out.println(instance2.normalStr); // null
    }
}

class StaticExp{
    static String str = null; // staticフィールドの宣言
    String normalStr = null; // インスタンスフィールドの宣言
}

例2 staticフィールドはインスタンス間で共有される(計算してみる)

public class Main {
    public static void main(String[] args) throws Exception {

    //オブジェクトStaticExpのインスタンス生成
    StaticExp instance1 = new StaticExp();
    StaticExp instance2 = new StaticExp();

    //変更前の値の確認
    System.out.println(instance1.in); // 0

    //staticフィールドを利用して値を変更
    instance1.in = 5;
    instance2.in += instance1.in;

    //instance1にもinstance2にもstaticフィールドは共有される
    //staticフィールドの値にも共有されている
    System.out.println(StaticExp.in); // 10

    //インスタンスフィールドを利用して値を変更
    instance1.normalIn = 3;
    instance2.normalIn += instance1.normalIn; // instance2.normalIn = 0+3

    //インスタンスフィールドは共有されない
    System.out.println(instance2.normalIn); //3
    }
}

class StaticExp{
    static int in ; // staticフィールドの宣言
    int normalIn; // インスタンスフィールドの宣言
}

例3 定数として使う

一番よく使われるstaticフィールドの使われ方です。

public class Main {
    public static void main(String[] args) throws Exception {
        int r = 10;
        //円の面積の計算
        double circle = r * r * Circle.PI;
        System.out.println(circle);
    }
}

class Circle {
    public static final double PI = 3.14; // 円周率
}