超类
public class food {
private String name;
public food( String name){
this.name = name;
}
public void foodName() {
System.out.println("This is "+name);
}
}
子类
public class Bacon extends food {
private String name;
public Bacon (String name) {
super(name);
this.name=name;
}
public void foodName() {
System.out.println("This is a food named " +name);
}
}
对于子类培根的变量 name 在overriden方法中工作,这是最佳实践还是有更好的方法来做到这一点?
public Bacon(String name){
super(name);
this.name=name;
}
答案 0 :(得分:1)
在类Bacon
中,name
的声明隐藏了Food
类中的名称声明,而Bacon类中对name的所有引用都引用了Bacon.name
not { {1}}。
请再次查看Inheritance chapter。
Food.name
中不再需要name
声明。删除声明,因为它正在扩展Food类,它将具有name属性。
要访问子类中的名称,请将名称属性的访问说明符添加为受保护的
Bacon class
同时修改构造函数
protected String name; //inherited classes can have access to this property
答案 1 :(得分:0)
在这种情况下,更合乎逻辑的是将name
变量标记为受保护,它将允许子类和包成员访问它。
超类
public class food {
protected String name;
public food( String name){
this.name = name;
}
public void foodName() {
System.out.println("This is "+name);
}
}
删除子类中的重复name
变量,只使用构造函数if superclass
public class Bacon extends food {
public Bacon (String name) {
super(name);
}
public void foodName() {
System.out.println("This is a food named " +name);
}
}
答案 2 :(得分:0)
Java中没有覆盖变量,并且通常不能从子类中的超类访问私有变量;所以你拥有的是两个独立的变量name
。
如果您希望子类有权访问该变量,请在超类中对其进行保护:
public class food {
protected String name;
//...
}
如果你真的想限制访问,而子类只需要使用变量(不要修改它),那么你应该使用一个getter方法。
public class food {
private String name;
protected String getName() {
return name;
}
//...
}
您的子类可以调用getName()
而不是name
。