【发布时间】:2015-05-22 15:27:31
【问题描述】:
关于 Java 静态方法的问题。
Animal()
{
this(makeRandomName());
}
我在 Java 中有这段代码,当我创建一个动物对象时会调用它:
Animal a = new Animal()
makeRandomName 是一种返回字符串的方法,该方法使用Math.random() 从字符串值数组中随机获取。
如果我没有将方法 makeRandomName 指定为 static,我会收到此错误(您能解释原因):
线程“主”java.lang.RuntimeException 中的异常:无法编译 源代码 - 在超类型构造函数之前无法引用 this 被叫了
另外,当 Animal 构造函数是这样定义的:
Animal()
{
this.name = makeRandomName();
}
我没有收到任何错误,不管 makeRandomName 是静态的还是非静态的。为什么?
有什么区别
this.name = makeRandomName(); 和 this(makeRandomName());
我以前从未见过this(method_name())这个语法,我只见过this.instance_variable = value,所以我有点困惑。我确信这与超级构造函数和调用方法的顺序有关,但是很高兴看到在这种情况下对方法和构造函数以及调用方法的顺序进行专家分析。非常感谢!
我被要求发布整个代码:
public class Animal {
String name;
Animal (String n)
{
this.name = n;
}
Animal()
{
this(makeRandomName());
//this.name=makeRandomName();
}
static String makeRandomName()
{
int x = (int) (Math.random()*5);
String l[] = new String[] {"Zlatan", "Ibra", "Edinson", "Gigi", "T"};
return l[x];
}
public static void main(String [] args)
{
Animal a = new Animal();
Animal b = new Animal("M");
System.out.println(a.name);
System.out.println(b.name);
}
}
【问题讨论】:
-
请贴出所有源代码。
-
makeRandomName 是对象上的一个方法,但在您至少调用了超级构造函数之前,该对象还没有被定义。
-
谢谢 DJClay,makeRandomName 是对象上的方法,在哪两种情况下?这两个调用如何更精确地不同?
this(makeRandomName());和this.name=makeRandomName();
标签: java constructor static