私はJava Certification Bates and Sierraの本から勉強してきましたが、第2章のコンストラクターの説明に困惑しています:
public class Animal {
String name;
Animal(String name) {
super();
{System.out.println("Hello");} //I put this in myself
this.name = name;
}
Animal() {
this(makeRandomName());
}
static String makeRandomName() {
int x = (int) (Math.random() * 5);
String name = new String[] {"Fluffy", "Fido",
"Rover", "Spike",
"Gigi"}[x];
return name;
}
public static void main (String [] args) {
Animal a = new Animal();
System.out.println(a.name);
Animal b = new Animal("Zeus");
System.out.println(b.name);
}
}
以下は、ベイツとシエラの本からのものです。
makeRandomName() メソッドが static とマークされていることに注意してください。これは、スーパー コンストラクターが実行されるまで、インスタンス (つまり、非静的) メソッドを呼び出す (またはインスタンス変数にアクセスする) ことができないためです。また、スーパー コンストラクターは、7 行目のコンストラクターからではなく、3 行目のコンストラクターから呼び出されるため、8 行目では静的メソッドのみを使用して名前を生成できます。
私は実験を行い、オーバーロードされたコンストラクターにスーパー呼び出しを挿入しました。結果は次のとおりです。
Hello
Rover
Hello
Zeus
これらの結果から、Hello が Zeus と Rover の前に出力されるため、オーバーロードされたコンストラクターとスーパー コンストラクターが静的メソッドの前に実行されているように見えます。では、なぜ静的変数が必要なのでしょうか?
私は何が欠けていますか?