【问题标题】:Why is a default constructor created even though my abstract class has a protected constructor? [duplicate]即使我的抽象类有一个受保护的构造函数,为什么还要创建一个默认构造函数? [复制]
【发布时间】:2015-11-21 00:50:59
【问题描述】:

我有一个抽象类MousableActor,它扩展了一个具体类Actor

public abstract class MousableActor extends Actor
{   
    /**
     * Constructs a MousableActor.
     */
    protected void MousableActor()
    {
    }
}

当我查看为该类生成的 javadoc 时,我看到了一个公共的无参数构造函数:

根据Section 8.8.9 of the JLS

如果一个类不包含构造函数声明,则隐式声明一个没有形式参数且没有 throws 子句的默认构造函数。

我一直认为这是一个 if-and-only-if。即使我明确声明了受保护的构造函数,为什么还要创建公共默认构造函数?是否与 the superclass 有一个公共的无参数构造函数有关?

我在 Java 1.8.0 之上使用 Greenfoot 版本 2.4.2(应该没关系)。

【问题讨论】:

  • 如果您使用了一个好的 IDE,它会告诉您有问题,例如Eclipse 显示警告“此方法具有构造函数名称”。
  • 很好很清楚的问题,付出了很多努力,虽然解决方案有点尴尬:)
  • @zapl 对于像我这样的 CS 教授来说,谦逊的教训总是有益的。我的学生喜欢听到我的错误,这让他们对自己的错误感觉更好。
  • 我们应该添加标签pebcak吗?

标签: java constructor default-constructor


【解决方案1】:

构造函数不是void 方法。

protected void MousableActor()

应该是

protected MousableActor()

【讨论】:

  • 天啊!我没有意识到方法可以与构造函数同名,而不是我意识到输入了“void”。
【解决方案2】:

因为它返回void,所以它不是构造函数;它是一个方法,所以没有构造函数,并且创建了默认构造函数。

如果您打算将其作为构造函数,则删除 void

【讨论】:

    猜你喜欢
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 2010-11-08
    • 2012-12-25
    • 2016-04-07
    • 2019-11-22
    • 2014-12-23
    • 2013-11-13
    相关资源
    最近更新 更多