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