繁体   English   中英

在Java中用超类的construtor调用抽象方法

[英]Calling an abstract method in super class's construtor in Java

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

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

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

更新:最后一个问题

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

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

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

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


编辑以回应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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM