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

标签 java constructor initialization

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

考虑以下工作:

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;
    }
}

最佳答案

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

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

关于java - 为什么在显式调用构造函数时不能引用实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3685506/

相关文章:

arrays - 初始化非标准值的 double 组的最快方法

java - 用java编写多表转置密码

Java:在属性文件中存储加密数据库(和其他)密码的最佳选择是什么?

java - 循环中的不可变对象(immutable对象)创建

c++ - 为什么在删除 `copy constructor`后仍使用 `move constructor`?

javascript - 在 CoffeeScript 构造函数中调用时,jQuery 无法将事件处理程序附加到对象

java - 如何从 RGB 值中分辨可见颜色

java - 如何为抽象类的子类声明默认构造函数?

swift 。不再需要初始化?

C++ 初始化列表