【问题标题】:Java constructor not called [closed]未调用 Java 构造函数 [关闭]
【发布时间】:2013-05-01 20:10:19
【问题描述】:

我有一个名为 Queen 的类,它是 Ant 的子类。 Queen 的构造函数接受参数,并将这些参数传递给 Ants 构造函数,以及 Queen 的其他细节。现在,这就是它应该如何工作的方式。但是我发现 Ant 构造函数从未被调用过。我错过了什么吗?

public class Queen extends Ant
{
    public Queen(int width, int height, Square[][] grid)
    {
        super(0, 0, width, height);
        //grid[locationHeight][locationWidth].addQueen(this);
    }
}

Ant 构造函数(我在这里有一些 println 语句,但在构造皇后时它们从未被调用过):

public Ant(int id, int type, int width, int height)
    {
        antID = id;
        antType = type;
        isAlive = true;
        width = width / 2;
        height = height / 2;
        setLocation(width, height);
        if (antType == 0)
        {
            lifeSpan = 73000;
        }
        else
        {
            lifeSpan = 3650;
        }
    }

【问题讨论】:

  • 向我们展示您用于实例化Queen 类的代码。
  • 我强烈怀疑您只是误诊了这一点。 Ant 构造函数确实被调用。
  • 编译器会强制Ant的构造函数被调用,为什么你认为它没有被调用?
  • 除非你在 Ant/Queen 中有其他构造函数,否则会调用 Ant 的构造函数。
  • 提供SSCCE,以便我们复制您所看到的内容。如果你描述了奇怪的异常行为,并且不提供重现它的代码,你会遇到很多怀疑。

标签: java inheritance constructor super


【解决方案1】:

在Java构造函数中总是调用它的超级构造函数。它要么隐式调用无参数父构造函数,要么您指定要调用的构造函数(这就是如果您的超类未指定默认构造函数,则必须调用超级构造函数的原因)。

来自java specification

如果构造函数体不是以显式构造函数调用开始,并且被声明的构造函数不是原始类 Object 的一部分,则构造函数体隐式以超类构造函数调用“super();”开始,调用其直接超类的构造函数,不带参数。

对于您的代码示例:如果没有完整的代码,很难知道发生了什么,但是如果 Queen 扩展了 Ant,并且显示的构造函数是唯一的,那么它应该工作。

【讨论】:

    【解决方案2】:

    您没有使用 Queen(int,int,Square[][]) 构造函数实例化您的 Queen 对象,您必须使用另一个构造函数或根本没有实例化 Queen。

    【讨论】:

    • 我删除了所有已编译的 .class 文件,然后重新编译。似乎已经解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 2012-02-02
    • 2018-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-11-20
    相关资源
    最近更新 更多