2014年10月8日水曜日

- 静的メンバ - Java

今回も、補足。

三大要素(カプセル化、継承、ポリモーフィズム)は難しいけれど、大切なので、その土台のために基本的な知識はしっかり理解しておく。
(丸暗記する必要はない)

今日は、比較的、簡単だから、さらっと書いていく。


静的メンバとは、静的フィールド、静的メソッドを指している。

この二つを表にした。






















一つずつみていく。


静的フィールド(クラス変数)

まず、静的フィールド(クラス変数)について。
どういうときに使うかというと、

同じクラスで生成されたインスタンスで、フィールドを共有したいとき!!

たとえば、現実世界で考えてみる。

「我が家の人間」クラスがある。
そこには 人間(続柄=夫、名前=さとし)、人間(続柄=妻、名前=ともみ)が生み出されている。
年齢、誕生日などのフィールドはそれぞれ違うけれど、
アイテムは共通である。(共有財産と呼ぶのかな)
掃除機、洗濯機、包丁、まな板などなど。

こういうときに、静的フィールドを使うと、「我が家の人間」クラスの持ち物に出来る。


package blog1008;

public class HomeMadeFamily {
 // 属性の定義
 String name;
 // 静的フィールドの定義
 static String item;

 void work (){
  this.name = "さとし";
  // 静的フィールド item に 文字列"圧力なべ" を代入
  this.item = "圧力なべ";
  System.out.println(this.name + "は、一生懸命働いて" + this.item + "を買った");
 }

 void cook (){
  this.name = "ともみ";

  // 静的フィールド item を呼び出せる
  System.out.println(this.name + "は、"+this.item + "を使って夕飯を作る!");
 }

}

package blog1008;

public class main {

 public static void main (String [] args){

 HomeMadeFamily f = new HomeMadeFamily();

 f.work();
 f.cook();

 }

}








無事に、「圧力なべ」を共有財産に出来ました。


静的フィールドの他の特徴もみてみる。


package blog1008;

public class HomeMadeFamily {
 // 属性の定義
 String name;
 // 静的フィールドの定義
 static String item = "圧力なべ";

 void work (){
  this.name = "さとし";
  // 静的フィールド item に 文字列"圧力なべ" を代入
  System.out.println(this.name + "は、一生懸命働いて" + this.item + "を買った");
 }

 void cook (){
  this.name = "ともみ";

  // 静的フィールド item を呼び出せる
  System.out.println(this.name + "は、"+this.item + "を使って夕飯を作る!");
 }

}

package blog1008;

public class main {

 public static void main (String [] args){

 // インスタンス化の一行をコメントアウトしてみる
 //HomeMadeFamily f = new HomeMadeFamily();

 System.out.println(HomeMadeFamily.item);

 }

}









このように、インスタンス化しなくても、静的フィールドは利用できますね。


静的メソッド(クラスメソッド)



package blog;

public class GlumlyLady {

 String name = "向かいのおばさん";
 // 静的フィールドの宣言
 static int glumlyPoint;

 // 静的メソッドの宣言
 static void randomGlumlyPoint(){
  // 静的フィールド glumlyPoint に 1~10 のランダムな整数を代入
  glumlyPoint = new java.util.Random().nextInt(10)+1;
 }
}

package blog;

public class main {

 public static void main(String [] args) {

  // new しなくても glumlyPoint を呼び出すことができる

  GlumlyLady.randomGlumlyPoint();
  System.out.println(GlumlyLady.glumlyPoint);

 }
}

実行結果は、整数一個だけなので、わざわざ載せませんが
1~10までの整数が表示されます。

ここで、注意点。
上の表に書いてある

static がついていない、フィールドや、メソッドが利用できない

とは、どういうことかというと。


package blog;

public class GlumlyLady {

 String name = "向かいのおばさん";
 // 静的フィールドの宣言
 static int glumlyPoint;

 // 静的メソッドの宣言
 static void randomGlumlyPoint(){
  // 静的フィールド glumlyPoint に 1~10 のランダムな整数を代入
  glumlyPoint = new java.util.Random().nextInt(10)+1;

  this.name = "ああああ";
 }
}

この、
this.name = "ああああ";

を書くとエラーになる。








このエラーメッセージが出てくる。

理由は、インスタンス化しなくても、呼び出せるメソッドなので、
一つもインスタンスがない状況では、 this.name の処理は出来ない。
なので、静的メソッドでは、静的フィールド、静的メソッドしか扱えない。


理屈を考えればわかるのだけど、初心者であるわたしが、はまってしまった罠でした。
クラスやメソッドを大量に書いていると、エラーの原因がわからなくなってきてしまうけれど、
エラーメッセージをよく読むと、書いてあることが多いから、
いくつかの失敗の原因を理解しておくのが大切ですね。
原因を理解していないときに、エラーメッセージを読んでも、よくわからなくなってしまいますし。

0 件のコメント:

コメントを投稿