在Java中调用超类构造函数中的抽象方法

时间:2012-11-15 03:27:38

标签: java inheritance abstract-class

由于子类尚未构造,在超类构造函数中调用抽象方法是不安全的吗?

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

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

更新:针对上一个问题

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的例子。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

我发现的一个例外是子类提供了一些“常量”信息,例如getId()getHandledMessages()等。