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; // 円周率
}