[英]Calling superclass from a subclass constructor in 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;
}
}
在薯片类中:
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
是私人的。 尽管您是从公共方法读取它,但您将它分配给一个私有字段,并且您可能没有在此类中声明它。
您可以在父类中将风味设置为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,否则您的子类将无法访问此字符串。 您的超类不知道任何子类的存在。 根据 Java 文档,“私有”使该类中的任何变量和方法都可用,其中声明了私有变量或方法,没有任何类可以访问它,甚至子类。 一旦您使用访问修饰符,您就不会收到任何错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.