代码之家  ›  专栏  ›  技术社区  ›  Koekiebox

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

  •  33
  • Koekiebox  · 技术社区  · 15 年前

    有人知道你为什么可以引用 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;
        }
    }
    
    6 回复  |  直到 11 年前
        1
  •  19
  •   amorfis    15 年前

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

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

        2
  •  12
  •   Pang Ajmal PraveeN    13 年前

    看到了吗 Java Language Specification 8.8.7.1 . 这说明

    构造函数体中的显式构造函数调用语句不能引用此类或任何超类中声明的任何实例变量、实例方法或内部类,也不能使用 this super

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

        3
  •  1
  •   GHad    15 年前

    我认为这是因为还没有设置最终实例变量(所以您还没有实例),并且实例方法可以访问它。而所有静态初始化都是在构造函数调用之前完成的。

    格里茨, 伽德

        4
  •  1
  •   mhshams    15 年前

        5
  •  1
  •   Thomas Mueller    15 年前

    此时TestNotWorking未初始化。问题是:第一个构造函数(TestNotWorking(aParam))可能会调用super()(在内部总是这样),这意味着您将在调用超类的构造函数之前调用一个方法。那是违法的。

        6
  •  0
  •   Florin    15 年前

    在第二个示例中,您需要创建一个类的对象 TestNotWorking 打电话给我 getAFromB 在那个物体上。

    比如:

    object = new TestNotWorking();
    object.getAFromB(bParam);