インスタンス変数・ローカル変数・クラス変数の違いについてまとめます。
##static変数(クラス変数)
- staticで宣言する変数のこと
- クラスの全てのインスタンスに共通する値を持つ。クラスにつく形で値を持つのでクラス変数ともいう
- クラス変数、クラスメソッドにアクセスするには**「クラス名.フィールド」**と書く必要がある
- 初期化していなくても、インスタンス生成を行なっていなくても、デフォルト値で初期化する
##インスタンス変数
- クラスの直下、メソッドの外に定義する変数
- 初期化していなくても、インスタンス生成時にデフォルト値で初期化する
- 同名のローカル変数がある時、「this.フィールド」、または「インスタンスを格納している変数名.フィールド」でアクセスする
※thisとは:そのクラスのオブジェクト自身のことをさす
##ローカル変数
- メソッド内で宣言する変数のこと(メソッドの中の仮引数または引数として使われる)
- インスタンス変数、クラス変数と同名のローカル変数を定義しても問題ない!!!
- 同名のローカル変数がある時、「this.フィールド」でインスタンス変数を表す。クラス変数は「クラス名.フィールド」で表す
- varによる型推論ができるのはローカル変数のみ
- 初期化されていないローカル変数は、参照するとコンパイルエラー
##コードで確認
public class Main{
public static void main(String[] args){
Party P1 = new Party();
Party P2 = new Party();
Party.budget = 10000;
P1.participants = 5;
P1.remain(); //budgetは9500として出力
System.out.println(Party.budget); //9500と出力
System.out.println(P2.budget); //9500と出力
P2.participants = 10;
P2.remain(); //8500と出力
System.out.println(Party.budget); //8500と出力
System.out.println(P1.budget); //8500と出力
}
}
class Party {
int participants; //インスタンス変数
static int budget; //static変数(クラス変数)
void remain(){
int expense = 100 * participants; //ローカル変数
budget -= expense;
System.out.println(budget);
}
}
・インスタンス変数と同じ名前のローカル変数を持たせる場合
public class Main{
public static void main(String[] args){
Party P1 = new Party();
Party P2 = new Party();
Party.budget = 10000;
P1.remain(); //budgetは8000として出力
System.out.println(Party.budget); //8000と出力
System.out.println(P2.budget); //8000と出力
P2.remain(); //6000と出力
System.out.println(Party.budget); //6000と出力
System.out.println(P1.budget); //6000と出力
}
}
class Party {
int participants; //インスタンス変数
static int budget; //static変数(クラス変数)
void remain(){
int participants = 20; //インスタンス変数と同名のローカル変数
System.out.println(participants);
System.out.println(this.participants); //thisを使うとインスタンス変数にアクセスできる
budget -= participants*100;
System.out.println(budget);
}
}