我一直在学习 Java 认证 Bates 和 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);
}
}
以下内容来自 Bates 和 Sierra 书中:
请注意,makeRandomName() 方法被标记为静态!这是因为在超级构造函数运行之前,您不能调用实例(换句话说,非静态)方法(或访问实例变量)。而且由于超级构造函数将从第 3 行的构造函数调用,而不是从第 7 行的构造函数调用,所以第 8 行只能使用静态方法来生成名称。
我做了一个实验,我在重载的构造函数中插入了一个超级调用,我的结果是:
Hello
Rover
Hello
Zeus
现在从这些结果来看,似乎重载的构造函数和超级构造函数在静态方法之前执行,因为 Hello 在 Zeus 和 Rover 之前打印。那么,为什么需要静态变量呢?
我错过了什么?