首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java超类构造器中调用抽象方法

在Java超类构造器中调用抽象方法
EN

Stack Overflow用户
提问于 2012-11-15 03:27:37
回答 2查看 1.4K关注 0票数 4

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

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

而且,如果它有效的话,如果我不想使超类变得抽象,该如何做呢?

更新:关于最后一个问题

代码语言:javascript
复制
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的例子。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-11-15 03:31:21

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

但是,如果所有子类只是返回一个不依赖于任何其他方法的常量,则应该可以。唯一的缺点是无法保证子类会以适当的方式覆盖该方法。

关于最后一个问题:这不是一个抽象的和具体的超类的问题。这是在构造函数中调用overridable方法时的一个问题。抽象与具体是无关的。

编辑回应OP的评论

我不知道你所说的“多形性”是什么意思。调用虚拟方法总是调用子实现。只有通过super关键字才能调用超类实现。例如:

代码语言:javascript
复制
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

这是:

代码语言:javascript
复制
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

票数 4
EN

Stack Overflow用户

发布于 2012-11-15 03:34:45

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13391140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档