【问题标题】:Calling superclass from a subclass constructor in Java从Java中的子类构造函数调用超类
【发布时间】:2013-10-20 00:16:16
【问题描述】:

我正在尝试创建一个将字段作为参数的构造函数,然后将其放入存储在超类中的字段中。这是我正在使用的代码

public crisps(String flavour, int quantity) {
    this.flavour = super.getFlavour();
    this.quantity = quantity;
}

在超类中,我用

初始化了该字段
private String flavour;

我有一个访问器方法

public String getFlavour() {
    return flavour;
}

我收到一个错误“flavour 在超类中具有私有访问权限”,但我相信这无关紧要,因为我正在调用将其返回到字段的访问器方法?

【问题讨论】:

  • 呃,你所拥有的应该可以正常工作。你确定你向我们展示了真正的代码吗?
  • 请发SSCCE 来复制您的问题。
  • title 是在 crisps 还是在父类中声明的?
  • 哦,标题是另一个类的错误,应该说是味道

标签: java subclass superclass accessor


【解决方案1】:

你应该做什么:

为你的超类添加一个构造函数:

public Superclass {
    public SuperClass(String flavour) {
       // super class constructor
       this.flavour = flavour;
    }
}

在 Crisps 类中:

public Crisps(String flavour, int quantity) {
    super(flavour); // send flavour to the super class constructor
    this.quantity = quantity;
}

 

评论

您的问题的一些问题:

“在超类中,我已经用”初始化了字段

private String flavour;

这不是初始化,而是声明。初始化是在您设置值时。

“我收到一个错误”flavor has private access in the superclass”但我相信这应该无关紧要,因为我正在调用将它返回到字段的访问器方法?”

当您调用访问器(又名 getter)时,没关系 - 取决于 getter 的可见性。 您代码中的问题是:

this.flavour = 

因为 flavor 不是在 Crisps 类中声明的字段,而是在 supper 类中声明的字段,因此您不能进行这样的直接访问。你应该使用我的建议或在 super class 上声明一个 setter:

public void setFlavour(String flavour) {
    this.flavour = flavour;
}

然后你可以在子类上使用它:

public Crisps(String flavour, int quantity) {
    this.quantity = quantity;
    super.setFlavour(flavour);
}

【讨论】:

  • @ipinto.eu 虽然你的答案是正确的,你的解决方案也是正确的,但你在答案中的最后一个替代解决方案(使用超类的设置器)违反了继承规则,我想,因为它会给“Overridable method call in constructor”问题。因此,您最后一个替代解决方案不是实际的解决方案,但会在代码中带来错误。我认为, super.setFlavour(flavour) 应该可以工作。
  • 我理解并同意;我必须说,这个例子是为了讨论。我喜欢您使用 super 调用它的建议,其他选项(和不同的理念)是使您的 setter 最终确定(无法覆盖)。
【解决方案2】:

制作

    private String flavour;

public,否则你的子类将无法访问此字符串。 您的超类不知道任何子类的存在。根据Java文档,“私有”使该类中的任何变量和方法都可用,其中声明了私有变量或方法,没有任何类可以访问它,甚至是子类。 一旦您获得访问修饰符的机会,就不会出现任何错误。

【讨论】:

    【解决方案3】:
    public crisps(String flavour, int quantity)
    {
        super(flavour);
        this.quantity = quantity;
    }
    

    这应该是see Docs

    【讨论】:

      【解决方案4】:

      flavour 是私有的。尽管您从公共方法中读取它,但您将其分配给私有字段,并且您可能没有在此类中声明它。

      您可以在父类中将风味设置为 protected 或为其定义一个设置器

      不过,最终您的代码并没有真正的意义。即使它确实编译了,它也或多或少:flavour = flavour。也许你应该重新考虑一下你正在尝试做的事情

      我认为您可能需要更深入地掌握 Java 和面向对象编程。

      http://docs.oracle.com/javase/tutorial/java/concepts/

      你应该从这里开始。

      【讨论】:

      • 好的,有没有办法通过调用公共方法getFlavour来做到这一点?
      • @user215732 getFlavour 就是这样做的。它得到flavour。您不能使用它来为风味分配值。如果它返回一个可变对象,那么您可以修改实际的风格,但在这种情况下,字符串是不可变的。
      • @user215732 你的crisps 构造函数有一个参数flavour 但你什么也没做,因为你的代码目前已经写好了。
      • @user215732 创建一个public setter。
      • @SotiriosDelimanolis 添加二传手后肯定会很有趣。 super.setFlavour(super.getFlavour()); 当然,现在看起来很有趣。
      猜你喜欢
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 2016-05-08
      • 1970-01-01
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      相关资源
      最近更新 更多