12

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

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

在超类中,我已经用

private String flavour;

我有一个访问器方法

public String getFlavour() {
    return flavour;
}

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

4

4 回答 4

21

你应该做什么:

将构造函数添加到您的超类:

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

在薯片类中:

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);
}
于 2013-10-11T21:10:27.840 回答
2

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

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

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

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

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

你应该从这里开始。

于 2013-10-11T20:03:50.077 回答
2
public crisps(String flavour, int quantity)
{
    super(flavour);
    this.quantity = quantity;
}

这应该像查看文档一样工作

于 2015-01-16T20:14:55.827 回答
2

制作

    private String flavour;

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

于 2016-04-01T18:27:31.467 回答