java - 在 Java 的父类(super class)构造函数中调用抽象方法

标签 java inheritance abstract-class

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

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

此外,如果可行,如果我不想将父类(super 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 的示例。

最佳答案

它通常(但不一定)被认为是不安全的。如您所说,父类(super class)可能未完全构建,因此无法处理子类可能在其重写方法中进行的所有调用。

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

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


根据 OP 的评论进行编辑

我不确定你所说的“多态性”是什么意思。调用虚方法总是调用最底层的实现。调用父类(super class)实现的唯一时间是通过 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";
    }   
  }   
}

打印子类

还有这个:

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

打印父类(super class)子类

关于java - 在 Java 的父类(super class)构造函数中调用抽象方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13391140/

相关文章:

java - 转换到一个抽象类......这怎么可能?

c++ - 为什么我必须在基类中定义虚函数?

java - 字符(运算符)的扫描仪输入如何工作?

java - 我怎样才能在 eclipse 中显示图像?

java - 如何获取双击的TreeTableNode?

c++ - ‘{’ 标记之前的预期类名

java - 添加新数据后 ComboBox 数据库值不会刷新

java - 使用 List<?> 成员定义抽象泛型类

c++ - 如何确保派生类实现特定方法,保留标准布局?

C++ 无法实例化抽象类子类