当前位置: 首页 > 面试题库 >

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

百里景山
2023-03-14
问题内容

有谁知道为什么可以static使用this()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;
    }
}

问题答案:

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

为什么会这样呢?因为实例方法可以访问实例(非静态)字段,该字段在不同实例中可以具有不同的值,所以在现有的已完成实例之外的其他地方调用这种方法没有任何意义。



 类似资料:
  • 可能的重复: 为什么this()和super()必须是构造函数中的第一条语句? 为什么子类构造函数必须显式调用超类构造函数?这是什么原因呢?

  • 根据我的理解,当创建了临时对象时,将调用move构造函数。这里,函数返回一个临时对象,但我的程序没有打印来自移动构造函数的消息:

  • 在上面的代码中,执行以下语句时不调用复制构造函数: 既然返回是按值的,为什么不调用复制构造函数? 谢啦

  • 问题内容: 为什么不能和这两个一起在构造函数中使用? 合并这样的东西的原因是什么? 问题答案: 将在同一类中调用另一个构造函数,而将调用超级构造函数。如果构造函数中没有,则编译器将隐式添加一个。 因此,如果两者都允许,您最终可能会两次调用构造函数。 示例(不要在参数中寻找含义): 现在,如果调用,将调用以下构造函数: 更新 : 如果您能够使用并且可能会得到如下结果: ( 注意 :这是为了说明 如果

  • 问题内容: 我有一个类A,并写了一个子类B。A只有一个参数化的构造函数。B必须调用A的这个超级构造函数。现在,我想使用一个Object作为参数。该对象应调用B的方法。因此,参数对象必须持有B的引用,或者必须是内部类。 现在,当我想调用构造函数时,……Eclipse说: 在显式调用构造函数时无法引用“ this”或“ super” 我唯一想解决的是设置方法,将“ this”实例注入到参数对象中。我不