构造函数再次被调用?

时间:2010-04-26 12:34:30

标签: java constructor methods call static-variables

我有这个构造函数;

public UmlDiagramEntity(ReportElement reportElement, int pageIndex, Controller controller) {
    super(reportElement.getX1(), reportElement.getY1(), reportElement.getX2(), reportElement.getY2());
    setLayout(null);

    this.pageIndex = pageIndex;
    this.controller = controller;
    reportElements = reportElement.getInternalReportElements();
    components = new ArrayList<AbstractEntity>();
    changedComponentIndex = -1;

    PageListener p = new PageListener();
    this.addMouseMotionListener(p);
    this.addMouseListener(p);

    setPage();
}

我在同一个班级有一个更新方法;

   @Override
    public void update(ReportElement reportElement) {
        if (changedComponentIndex == -1) {
            super.update(reportElement);
        } else {
            reportElements = reportElement.getInternalReportElements();
            if (components.size() == reportElements.size()) {
                if (!isCommitted) {
                    if (reportElement.getType() == ReportElementType.UmlRelation) {
                        if (checkInvolvementAndSet(changedComponentIndex)) {
                            anchorEntity(changedComponentIndex);
                        } else {
                            resistChanges(changedComponentIndex);
                        }
                        return;
                    }
                }
..................goes on

当我按照调试器的流程进行操作时,我看到在调用update时,在方法的某个地方,程序进入构造函数并重新执行它(super,pageIndex等)。为什么要去构造函数:D我没有告诉它去那里。

如果您愿意,我可以进行更深入的分析并查看构造函数的位置。顺便说一句,changedComponentIndex是一个静态变量。

4 个答案:

答案 0 :(得分:1)

我会发现你看到它构建两个不同的对象的可能性要大得多。您必须提供更多信息,如堆栈跟踪;在这里你甚至没有显示被调用的构造函数!

答案 1 :(得分:0)

您描述的行为几乎是不可能的。您的代码与您显示的代码不同,或者您没有调试您认为正在调试的代码。如果没有complete code that we can run,那就是我们所能说的。

答案 2 :(得分:0)

您确定不会在构造函数中间接调用更新,这会导致更新中的断点被触发。

尝试在构造函数的开头和结尾处设置断点,然后在更新中设置断点。当您点击第一个构造函数断点时,点击“继续”并查看下一个触发的断点。

答案 3 :(得分:0)

这是多线程的吗?是否有可能在另一个线程上创建另一个实例的构造函数?