今日もJavaの勉強。まず「クラスにフィールドもメソッドも定義していない状態」っていうのがどういう状態なのかを例示します。
―――――――――――――――――
package shinuchi;
class Justifiable {
public static void main(String[] args) {
Justifiable studioapartment = new Jutifiable();
studioapartment.name = “ミュージシャン”;
studioapartment.age = 700;
studioapartment.show();
}
}
―――――――――――――――――
こんな状態。エラー出まくり、まったく意味不明。shinuchiパッケージの中に、Justifiableっていうクラスを用意したのはいいんだけど。
mainメソッドを含む1クラスしかないプログラムなのに、インスタンスを生成しようとしているのが意味不明だ。
インスタンスを生成する時ってのは、クラスを利用したい時だけど、その利用したいクラスが自分自身ってのはおかしい。
だから「Justifiable studioaprtment = new Jutifiable();」ってところで、既にエラーが出てる。
判りやすく例えよう。クラスを召喚獣だとする。
「Justifiableクラスを使おう」と思ってインスタンス生成してクラスを召喚しようと思ったら、「あれJustifiableクラスって自分じゃん?何で自分を召喚するの?」って感じよ。自分で自分を召喚する魔法使いがいるかって話よ。
単にJustifiable とJutifiableで、スペルが違ってただけだった。
スペルが一致してたらエラーは出ない。自分自身のインスタンスを生成して、フィールドやメソッドを呼び出すことは可能。ただし、もしフィールドやメソッドを呼び出したいなら、クラスを宣言した後に、フィールドもメソッドも定義を行わないといけない。
だからその後、studioaprtmentっていう変数に自分を格納して、その後、クラスのフィールドを「studioapartment.name = “ミュージシャン”; 」「studioapartment.age = 700;」って呼び出したり、メソッドを「studioapartment.show();」とかで呼び出そうとしてるけど、全部エラーよ。
自分で自分を参照してるんだから。完全にインスタンスの使い方を間違ってる例。
少し書き変えてみる。
―――――――――――――――――
package shinuchi;
class Justifiable {
String name;
int age;
public static void main(String[] args) {
Justifiable studioapartment = new Justifiable();
studioapartment.name = “ミュージシャン”;
studioapartment.age = 700;
studioapartment.show();
}
}
―――――――――――――――――
でも、これでもエラーがまだ残る。
ただ、
studioapartment.name = “ミュージシャン”;
studioapartment.age = 700;
の箇所のエラーは、消えた。
なぜかというと…
String name;
int age;
を加えて、クラスのフィールドを定義したからよ。
だからJutifiableクラス、自分自身であるが、変数nameとageの値はちゃんと格納することができたってことね。
けど「studioapartment.show();」のエラーは消えてない。
そんなわけなんで、無理矢理プログラムを実行すると、
Exception in thread “main” java.lang.Error: Unresolved compilation problems:
Jutifiable を型に解決できません
メソッド show() は型 Justifiable で未定義です
at shinuchi.Justifiable.main(Justifiable.java:8)
というエラーが出てくる。メソッドは定義されてないからね。
だからメソッドを定義して、完成させる。
そんで「Justifiable studioapartment = new Jutifiable();」っていうインスタンスの生成のとこのエラーも消えた!
自分で自分を呼び出してるのになぜ…なるほど。
そういうインスタンスの使い方ってのも、できるってわけか。
―――――――――――――――――
package shinuchi;
class Justifiable { //クラス宣言
String name; //フィールド定義
int age; //フィールド定義
void show() {
System.out.println(“StudioApartmentは” + name + “です。\n” + “年齢は” + age + “歳です。”);// エスケープシーケンス利用
} //メソッド定義
public static void main(String[] args) {
Justifiable studioapartment = new Justifiable(); //インスタンス生成
studioapartment.name = “ミュージシャン”; //フィールド呼び出し
studioapartment.age = 700; //フィールド呼び出し
studioapartment.show(); //メソッド呼び出し
}
}
―――――――――――――――――
これで完全にエラーは消えてコンパイル完了、実行結果に、
StudioApartmentはミュージシャンです。
年齢は700歳です。
と、出力されたね~。
クラスが1個しかないプログラムでも、インスタンス化=実体化してフィールドとメソッドを呼び出し、処理を行わせることができるってことが、証明されたね。
ちなみにstudio apartmentのJustifiableは自分の好きなアーティストと曲だから変数名にしてみた。
「Rising Sun」っていうアルバムに収録されてる。いい曲なのでぜひ。
Javaのオーバーライドの問題、また解いてみるか。→ http://www.fit.ac.jp/~m-ishihara/Lectures/H22/JavaProgramming2/07/JavaProgramming2_Assignment(07).pdf
トップページ(低価格ヒルズ)に戻る