为什么在显式调用构造函数时不能引用实例方法?

2022-09-01 03:19:42

有谁知道为什么你可以使用 or 在构造函数的第一行引用一个方法,而不是一个非静态方法?staticthis()super()

请考虑以下工作:

public class TestWorking{
    private A a = null;
    public TestWorking(A aParam){
       this.a = aParam;
    }

    public TestWorking(B bParam)
    {
        this(TestWorking.getAFromB(bParam));
    }

    //It works because its marked static.
    private static A getAFromB(B param){
        A a = new A();
        a.setName(param.getName());
        return a;
    }
}

以及以下非工作示例:

public class TestNotWorking{
    private A a = null;
    public TestNotWorking(A aParam){
       this.a = aParam;
    }

    public TestNotWorking(B bParam)
    {
        this(this.getAFromB(bParam));
    }

    //This does not work. WHY???
    private A getAFromB(B param){
        A a = new A();
        a.setName(param.getName());
        return a;
    }
}

答案 1

非静态方法是实例方法。这只能在现有实例中访问,并且当您处于构造函数中时实例尚不存在(它仍在构造中)。

为什么会这样?由于实例方法可以访问实例(非静态)字段,这些字段在不同的实例中可以具有不同的值,因此在现有已完成实例以外的其他设备上调用此类方法没有意义。


答案 2

请参阅 Java 语言规范 8.8.7.1。这说明

构造函数体中的显式构造函数调用语句不得引用在此类或任何超类中声明的任何实例变量或实例方法或内部类,或者使用或在任何表达式中声明;否则,将发生编译时错误。thissuper

这是因为在创建实例之前无法调用实例方法。顺便说一句,可以稍后在构造函数中调用实例方法(尽管不是您的解决方案)。