Java中从构造函数调用的静态方法
关于Java静态方法的问题Java中从构造函数调用的静态方法,java,constructor,static,Java,Constructor,Static,关于Java静态方法的问题 Animal() { this(makeRandomName()); } 我用Java编写了这段代码,在创建动物对象时调用: Animal a=新动物() makeRandomName是一种方法,使用Math.random()返回从字符串值数组中随机获得的字符串。 如果我没有将makeRandomName方法指定为static,则会出现此错误(您能否解释原因): 线程“main”java.lang.RuntimeException中的
Animal()
{
this(makeRandomName());
}
我用Java编写了这段代码,在创建动物对象时调用:
Animal a=新动物()
makeRandomName
是一种方法,使用Math.random()
返回从字符串值数组中随机获得的字符串。
如果我没有将makeRandomName方法指定为static,则会出现此错误(您能否解释原因):
线程“main”java.lang.RuntimeException中的异常:不可编译
源代码-在超类型构造函数创建之前无法引用此
被叫
此外,当动物构造器定义如下:
Animal()
{
this.name = makeRandomName();
}
无论MakerRandomName是静态的还是非静态的,我都不会得到任何错误。为什么?
两者的区别是什么
this.name=makeRandomName()
和这个(makeRandomName())代码>
我以前从未见过这种语法this(method\u name())
,我只见过this.instance\u 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()
指定为static的原因是makeRandomName()
是一个实例方法,在从构造函数中调用super
之前无法访问,这会导致初始化类。您试图做的是在调用super
初始化类之前调用makeRandomName()
,从而导致编译错误
对于第二个问题,有一个对super()的隐式调用代码>在声明this.name=makeRandomName()之前代码><代码>超级(…)
必须始终是构造函数中的第一条语句,即使您没有显式地编写它。因此,第二个构造函数的实际代码如下:
Animal() {
super();
this.name = makeRandomName();
}
makeRandomName()
此时可以访问,即使它被声明为非静态,因为对象已经被构造。在第一种情况下this()
您试图调用类构造函数,并试图将该类中定义的方法的结果传递给它。您首先创建的对象此时尚未初始化,因此它正在尝试从内部访问尚未初始化的方法<必须先调用code>super()
,然后才能访问该方法,但在这种情况下,不能先调用super()
,然后再调用this()
,因为java要求this()
作为构造函数中的第一条语句(如果将它放在构造函数中)
this(makeRandomName())
正在调用构造函数,并试图将makeRandomName()
的结果传递给构造函数调用。问题是,此时对象尚未初始化,因此无法调用makeRandomName()
this.name=makeRandomName()
在初始化对象后,将makeRandomName()
的返回赋值给类的实例变量
在构造函数内部调用构造函数是没有意义的,因为您将遇到递归情况……除非这样做有某种设计原因,但在这种情况下,您将需要一个基本情况来在某个点突破递归。您看到这个问题是因为您正在调用一个对象(vs Class)方法:“makeRandomName”在超类构造函数运行之前(您将结果作为参数传递)。在对象上运行任何方法之前,对象的超级构造函数必须已经执行。这就是为什么它总是构造函数的第一行您调用的
实例方法
makeRandomName()在super()
之前,它不可访问,因为尚未创建实例/对象
由于构造函数本身在构造函数正文的第一行中默认称为super()
,因此以下构造函数可以工作
Animal() {
//this(makeRandomName());
this.name=makeRandomName();
}
您调用的以下构造函数this()
,在本例中,super()
将不会在构造函数Animal()
中调用,但在Animal(字符串名称)
中调用,不幸的是makeRandomName()
无法访问
Animal() {
this(makeRandomName());
//this.name=makeRandomName();
}
Animal(String name){
// super() is invoked implicitly here...
}
请发布所有源代码。makeRandomName是对象上的一个方法,但直到您至少调用了超级构造函数,对象才被定义。谢谢您,DJClay,makeRandomName是对象上的一个方法,在这两种情况中,哪一种情况下?这两个调用有什么更精确的区别?this(makeRandomName())
和this.name=makeRandomName();
所以我在super()之前调用了一个对象方法(this(makeRandomName());
假设makeRandomName是非静态的)。谢谢ControlAltDel。问题:super()吗即使我们不显式地键入它,也不会作为构造函数中的第一个语句隐式调用?这就是我的想法。它如何与另一个变量一起工作?(`this.name=makeRandomName();`)@Samy如果使用this()
,那么this()
必须是第一个语句,否则super()
是第一条语句。谢谢brso05!我有一个问题:我一直听说在一种情况下,对象尚未初始化,因此无法调用非静态方法。在另一种情况下,对象已初始化,因此我们可以调用非静态或静态方法(这无关紧要)。为什么这(makeRandomName())
不初始化对象,而this.name=makeRandomName()
初始化它?我还是有点困惑。@Samy因为如果调用this(makeRandomName())
它