Ale*_*hov 4 java inheritance class-design subclass
在Java中,是否可以覆盖子类中的成员数据,并将该重写版本作为超类实现中使用的数据?
换句话说,这就是我想要发生的事情,并且它没有发生:
abstract public class BasicStuff {
protected String[] stuff = { "Pizza", "Shoes" };
public void readStuff() {
for(String p : stuff) {
system.out.println(p);
}
}
}
Run Code Online (Sandbox Code Playgroud)
..
public class HardStuff extends BasicStuff {
protected String[] stuff = { "Harmonica", "Saxophone", "Particle Accelerator" };
}
Run Code Online (Sandbox Code Playgroud)
这个调用:
HardStuff sf = new HardStuff();
sf.readStuff();
Run Code Online (Sandbox Code Playgroud)
...打印Pizza和Shoes.我想让它打印后者.
我认识到这是一个相当差的等级OO实践; 我需要它用于非常具体的情况,因为我正在使用XML配置和反射.
有没有可以实现这一目标的修饰符?
是的,我确实认识到有一些包装可以用来解决我的子类中的这个问题,例如通过指示现在的内容stuff[]存储在具有不同名称的数组中.我只是想保持这个简单,原则上我很好奇.
非常感谢提前!
Ale*_*lli 13
我相信你必须插入一个访问器方法,即使用:
for(String p : getStuff()) {
Run Code Online (Sandbox Code Playgroud)
在超类中,添加:
protected String[] getStuff() { return stuff; }
Run Code Online (Sandbox Code Playgroud)
无论你在哪里protected String[] stuff重新定义.
覆盖真的适用于方法,而不是数据(至少,在Java模型中是这样;其他一些语言以不同的方式执行),因此为了获得覆盖效果,您必须设置一个方法(通常是一个简单的访问器,就像这里).它根本不会使事情变得复杂,它只是一种非常简单的方法来指示Java编译器本质上使用您期望的行为所需的"额外级别的间接".