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

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

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

在超类中,我用字段初始化了字段

 private String flavour; 

我有一个访问方法

 public String getFlavour() { return flavour; } 

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

你应该做什么:

在超类中添加构造函数:

 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类上,所以你不能像这样直接访问。 你应该使用我的建议或在超类上声明一个setter:

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

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

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

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

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

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

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

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

你应该从这里开始。

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

这应该像文档一样工作

使

  private String flavour; 

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