4

既然子类还没有构造,那么在超类构造函数中调用抽象方法是不是不安全呢?

但是,如果方法的行为不依赖于子类的构造,例如只返回一个关于子类的常量,它是否仍然不安全或者它会可靠地工作?

此外,如果它有效,如果我不想使超类抽象怎么办?

更新:最后一个问题

public class SuperClass {
      public SuperClass() {
          System.out.println(getValue());
      }   

      public String getValue() {
          return "superclass";
      }   

      public static void main(String[] args) {
           new SubClass();
      }

}


class SubClass extends SuperClass {
      public SubClass() {
           super(); // Comment out this or not  will not affect the result
      }   

      public String getValue() {
           return "subclass";
       }   
}

我写了一个测试,并弄清楚:结果是:subclass 感谢@Tim Pote的例子。

4

2 回答 2

4

它通常(尽管不一定)被认为是不安全的。正如您所说,超类可能没有完全构造,因此不会准备好处理子类可能在其重写方法中进行的所有调用。

但是,如果所有子类都简单地返回一个不依赖于任何其他方法的常量,那么它应该没问题。唯一的缺点是您不能保证子类会以适当的方式覆盖该方法。

关于您的最后一个问题:这不是抽象与具体超类的问题。这是在构造函数中调用可覆盖方法的问题。抽象与具体是无关紧要的。


根据OP的评论进行编辑

我不确定您所说的“多态”是什么意思。调用虚方法总是调用最底层的实现。唯一一次调用超类实现是通过super关键字。例如:

public class SuperClass {
  public SuperClass() {
    System.out.println(getValue());
  }   

  public String getValue() {
    return "superclass";
  }   

  public static void main(String[] args) {
    new SubClass();
  }   

  public static class SubClass extends SuperClass {
    public String getValue() {
      return "subclass";
    }   
  }   
}

打印subclass

还有这个:

public class SuperClass {
  public SuperClass() {
    System.out.println(getValue());
  }   

  public String getValue() {
    return "superclass";
  }   

  public static void main(String[] args) {
    new SubClass();
  }   

  public static class SubClass extends SuperClass {
    public String getValue() {
      return super.getValue() + " subclass";
    }   
  }   
}

印刷superclass subclass

于 2012-11-15T03:31:21.130 回答
1

正如其他人所解释的那样,在超类构造函数中调用抽象方法存在固有风险。

我发现的一个例外是当子类提供一些“恒定”信息时,例如getId()getHandledMessages()等等。

于 2012-11-15T03:34:45.670 回答