当前位置: 首页 > 面试题库 >

是否可以在构造函数中的super()之前进行计算?

有宏邈
2023-03-14
问题内容

假设我有一个Base类,该类具有一个带有TextBox对象作为参数的单个参数构造函数。如果我有以下形式的简单类:

public class Simple extends Base {
  public Simple(){
    TextBox t = new TextBox();
    super(t);
    //wouldn't it be nice if I could do things with t down here?
  }
}

我会收到一条错误消息,告诉我对super的调用必须是构造函数中的第一个调用。但是,奇怪的是,我可以做到这一点。

public class Simple extends Base {
  public Simple(){
    super(new TextBox());
  }
}

为什么允许这样做,但第一个例子不允许?我可以理解需要先设置子类,并且可能不允许在调用超级构造函数之前实例化对象变量。但是t显然是方法(局部)变量,那么为什么不允许它呢?

有没有办法解决这个限制?在调用super之前但在进入构造函数之后,是否存在一种良好且安全的方式来将变量保存到可能要构造的事物中?或者,更笼统地说,允许在super被实际调用之前但在构造函数中进行计算?

谢谢。


问题答案:

是的,您有一个简单的解决方法。您可以创建一个TextBox以参数为参数的私有构造函数,并从您的公共构造函数中调用它。

public class Simple extends Base {
    private Simple(TextBox t) {
        super(t);
        // continue doing stuff with t here
    }

    public Simple() {
        this(new TextBox());
    }
}

对于更复杂的东西,您需要使用工厂或静态工厂方法。



 类似资料:
  • 问题内容: 我正在阅读一些代码。在构造函数中,它具有super(),但类实现的接口当然没有构造函数。那么它指的是哪个super()? 问题答案: 指扩展(不是已实现的接口)。在这种情况下是 因此它将在中调用构造函数(不执行任何操作)

  • 问题内容: 代码是什么 在构造函数内部吗? 例如,这是我的课程的构造函数 它和超类有关吗? 问题答案: 它调用父类的构造函数

  • 我知道这个问题被问了很多次,但仍然不清楚。很多人刚才说, 如果您想访问,请将道具传递给构造函数 答案的另一个例子 Oficial doc说类组件应该始终使用props调用基构造函数,但如果我们不将传递给,我们仍然会将放在除构造函数之外的所有地方。 同样从react源代码中,我们可以看到react.Component 但这更让我困惑应使用两个参数调用:和。但是我们调用了super-empty,仍然可

  • 是否可以在子类的构造函数中重写s或s?我想初始化(或设置)子类构造函数中的trait的成员或抽象类的成员作为参数。 下面是一个例子。 当我编译这个的时候,没有任何错误。但是,我想知道这个实现中是否有bug,或者哪里有更好的实现。

  • 问题内容: 谁能解释以下程序的输出?我认为构造函数要在实例变量之前初始化。因此,我期望输出为“ XZYY”。 问题答案: 正确的初始化顺序是: 如果该类先前尚未初始化,则按文本顺序的静态变量初始化程序和静态初始化块。 构造函数中的super()调用,无论是显式的还是隐式的。 实例变量初始化程序和实例初始化块,按文本顺序。 super()之后构造函数的其余主体。

  • 我得到以下错误: 一个月后,我正在检查我的程序,之前相同的代码没有给出错误,我想我没有改变任何可能导致这一点的东西。我试图解决这个问题;所以在第1行的错误中提到: