从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”使得该类中的任何变量和方法可用,其中声明了私有变量或方法,没有任何类可以访问它,甚至是子类。 一旦有机会访问修饰符,就不会出现任何错误。