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

2019-09-01

staticフィールドとは、インスタンスを生成しなくても利用できるフィールドです。

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

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

staticフィールド宣言方法

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

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

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

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

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

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

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

staticフィールドは共有される

例1

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フィールドは共有される
//結果はどちらもhaha
System.out.println(instance1.str); // haha
System.out.println(instance2.str); //haha


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

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

例2

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; // インスタンスフィールドの宣言
}