【文系でもわかるJavaのインスタンスについてエラー文から考察】クラスにフィールドもメソッドも定義していない状態なのにmainメソッド内で値を使おうとしたりshowメソッドを呼び出そうとしても実行できない

今日も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

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

トップページ(低価格ヒルズ)に戻る

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です