有关Java静态方法的问题。

Animal()
{
    this(makeRandomName());
}

我在Java中有以下代码,当我创建动物对象时会调用该代码:Animal a = new Animal()makeRandomName是一种通过使用Math.random()返回从字符串值数组中随机获取的字符串的方法。
如果我未将方法makeRandomName指定为静态,则会收到此错误(您能否解释原因):

线程“主”中的异常java.lang.RuntimeException:无法编译
源代码-在超类型构造函数具有之前不能引用此
被称为

同样,当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()指定为静态的原因是,因为makeRandomName()是实例方法,在构造函数内部调用super之前,将无法访问makeRandomName(),这将导致类被初始化。您尝试执行的操作是在调用super初始化类之前调用​​super();,从而导致编译错误。

对于第二个问题-在您声明this.name = makeRandomName();之前隐式调用super(...);makeRandomName()必须始终是构造函数中的第一条语句,即使您未明确编写它也是如此。因此,第二个构造函数的实际代码是这样的:

Animal() {
    super();
    this.name = makeRandomName();
}

此时ojit_code即使已声明为非静态,也可以访问,因为该对象已被构造。

09-25 21:03