Java:抽象类构造函数和 this()

标签 java constructor this abstract

有人可以指出我的误解吗?

我有两个类,一个抽象类和一个具体类,如下所示:

public abstract class Abstract
{
    protected static int ORDER = 1;

    public static void main (String[] args)
    {
        Concrete c = new Concrete("Hello");
    }

    public Abstract()
    {
        Class c = this.getClass();
        System.out.println(ORDER++ + ": Class = " 
            + c.getSimpleName() 
            + "; Abstract's no-arg constructor called.");
    }

    public Abstract(String arg)
    {
        this();
        Class c = this.getClass();
        System.out.println(ORDER++ + ": Class = " 
            + c.getSimpleName() 
            + "; Abstract's 1-arg constructor called.");
    }
}

public class Concrete extends Abstract
{
   public Concrete()
   {
      super();
      Class c = this.getClass();
      System.out.println(ORDER++ + ": Class = " 
          + c.getSimpleName() 
          + "; Concrete's no-arg constructor called.");
   }

   public Concrete(String arg)
   {
      super(arg);
      Class c = this.getClass();
      System.out.println(ORDER++ + ": Class = " 
          + c.getSimpleName() 
          + "; Concrete's 1-arg constructor called.");
   }
}

当我运行它时,我得到以下输出:

1) Class = Concrete; Abstract's no-arg constructor called.
2) Class = Concrete; Abstract's 1-arg constructor called.
3) Class = Concrete; Concrete's 1-arg constructor called.

我的问题是:为什么 Abstract 的 String arg 构造函数对 this() 的调用不调用 Concrete 上的无参数构造函数?或者,也许更相关的是,有没有办法让 Abstract 的 String arg 构造函数调用 Concrete 上的无参数构造函数,从而允许构造函数的“正确”链接?

最佳答案

否 - 构造函数链接总是要么横向(在同一类型中)要么向上(到父类型)。

不要忘记调用必须在编译时解析 - 并且 Abstract 不知道其他类将从它派生什么,或者他们将拥有哪些构造函数。

可以Abstract构造函数中调用虚拟方法,并在Concrete中重写该方法...但我强烈建议您< em>不这样做。特别是,Concrete 的构造函数主体尚未执行,变量初始值设定项也不会执行 - 因此它无法对 Concrete 执行任何操作 -具体状态。在某些非常特定情况下,这样做是正确的,但这种情况很少见,应谨慎处理。

你到底想做什么?通常我发现最好有许多“横向”链通向具有“向上”链的单个构造函数。

关于Java:抽象类构造函数和 this(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1859546/

相关文章:

java - 正则表达式替换不正确的查询

c# - 构造通用对象(不是默认构造函数)

c++ - 在同一个类的析构函数中调用类的构造函数

javascript - 如何正确选择一个 div 呢?

javascript - 如何在 JavaScript 中无需任何内联函数调用即可获取点击时的元素 id?

java - 如何动态加载具有公共(public)抽象类的jar?

java - 我的插入语句有什么问题? mysql 的 java

java - 枚举作为实例变量

python - 如果子类中缺少 __init__() 会发生什么?

javascript - 如何在类函数中使 this 不为空?