static〜 静的フィールド
newによって生成されるインスタンスはそれぞれ別のもの(独立している)
→よって、同じクラスを金型にしていたとしても、
基本的にはインスタンスごとにそれぞれ違う情報を代入する
ex. class Hero{
int hp;
}
class Main{
public static void main(String[ ] args){
Hero h1=new Hero( );
h1.hp=70;
Hero h2=new Hero( );
h2.hp=100;
Hero h3=new Hero( );
h3.hp=120;
}
ただ、全てのインスタンスが1つの情報を共有したい時
ex. 勇者インスタンス全員で1つの財布を管理したい
→つまり、Heroというクラスに対して1つ財布を作りたいということ
(インスタンスは元をたどれば1つの金型(クラス)から出来ている)
このように、
同じクラスから生成されたインスタンスで1つの情報(1つのフィールド)を共有したい場合
⇨ フィールド宣言の先頭に、staticキーワードを追加する
これを、「静的フィールド」という
ex. public class Hero{
String name;
int hp;
static int money;
//このあとHeroインスタンスをいくつ作っても、財布の数は1つになるということ
}
〈静的フィールドの特徴〉
3つの特殊効果を持つ
1. インスタンスではなく、
クラス(金型)そのものに、情報が準備された箱(フィールド変数)がつく
・・・例えば、
Heroクラス自体につく変数なので、moneyの情報を書き換える時は
「Hero.money」と指定しなければいけない
⇩
〈静的フィールドへのアクセス方法〉
「クラス名.静的フィールド名」
2. 静的フィールドをつけたクラス(金型)から生成された
全インスタンスには、静的フィールドを指す箱が出来る
ただ静的フィールドを指しているだけなので、
中身の入っている実体は1つの箱
・・・なので、例えば、
例えば、h1.moneyに値を代入すると、Hero.moneyの値も書き換えられる
ex. Hero.money=100;
↑クラスについている箱(静的フィールド)に100を代入
h1.money=300;
↑インスタンスについている静的フィールドを指している箱の方に300を代入
すると...
Hero.moneyを出力 → 300
h1.moneyを出力 → 300
h2.moneyを出力 → 300
値は全て後から代入した値の方に書き換えられる
3.インスタンスを1つも生み出さなくても静的フィールドは利用可能
(そもそもインスタンス生成前の金型(クラス)の方についている箱だから)
ex. class Main{
public static main(String[ ] args){
newの記述をせずに・・・
Hero.money=100;//クラスについている静的フィールドに100を代入
moneyを出力してみる
System.out.println(Hero.money);
}
出力結果 100 ←ちゃんと代入されて出力される