从Java中的子类构造函数调用超类

时间:2013-10-11 19:56:46

标签: java subclass superclass accessor

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

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

在超类中,我用

初始化了字段
private String flavour;

我有一个存取方法

public String getFlavour() {
    return flavour;
}

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

4 个答案:

答案 0 :(得分:19)

你应该做什么:

向超类添加构造函数:

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;

这不是初始化,而是声明。初始化是指设置值。

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

当你调用一个访问者(也就是getter)时,它没问题 - 取决于getter的可见性。 代码中的问题是:

this.flavour = 

因为flavor不是在Crisps类上声明的字段,而是在supper类上,所以你不能像这样直接访问。你应该使用我的建议或在超级

上宣布一个设定者
public void setFlavour(String flavour) {
    this.flavour = flavour;
}

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

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

答案 1 :(得分:2)

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

您可以在父类中将flavor设置为protected或为其定义一个setter

最终,你的代码确实没有意义。即使它确实编译了,也会更多或更少:flavour = flavour。也许你应该重新考虑一下你想要做些什么

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

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

你应该从这里开始。

答案 2 :(得分:2)

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

这应该是see Docs

答案 3 :(得分:2)

制作

    private String flavour;

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