美人すぎない化粧品販売員がアプリ開発を目指す

Javaの構文、オブジェクト指向、APIなど、プログラミング初心者の私がアプリ開発までに理解したことをまとめたブログ

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  ←ちゃんと代入されて出力される