三大要素(カプセル化、継承、ポリモーフィズム)は難しいけれど、大切なので、その土台のために基本的な知識はしっかり理解しておく。
(丸暗記する必要はない)
今日は、比較的、簡単だから、さらっと書いていく。
静的メンバとは、静的フィールド、静的メソッドを指している。
この二つを表にした。
一つずつみていく。
■静的フィールド(クラス変数)■
まず、静的フィールド(クラス変数)について。
どういうときに使うかというと、
同じクラスで生成されたインスタンスで、フィールドを共有したいとき!!
たとえば、現実世界で考えてみる。
「我が家の人間」クラスがある。
そこには 人間(続柄=夫、名前=さとし)、人間(続柄=妻、名前=ともみ)が生み出されている。
年齢、誕生日などのフィールドはそれぞれ違うけれど、
アイテムは共通である。(共有財産と呼ぶのかな)
掃除機、洗濯機、包丁、まな板などなど。
こういうときに、静的フィールドを使うと、「我が家の人間」クラスの持ち物に出来る。
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 件のコメント:
コメントを投稿