覆盖子类中的成员数据,用于超类实现?
在Java中,是否可以覆盖子类中的成员数据并将该重写版本作为超类实现中使用的数据?
换句话说,这就是我想要发生的事情,并且它没有发生:
abstract public class BasicStuff { protected String[] stuff = { "Pizza", "Shoes" }; public void readStuff() { for(String p : stuff) { system.out.println(p); } } }
..
public class HardStuff extends BasicStuff { protected String[] stuff = { "Harmonica", "Saxophone", "Particle Accelerator" }; }
这个调用:
HardStuff sf = new HardStuff(); sf.readStuff();
…打印Pizza
和Shoes
。 我想让它打印后者。
我认识到这是一个相当差的等级OO实践; 我需要它用于非常具体的情况,因为我正在使用XML配置和reflection。
有没有可以实现这一目标的修饰符?
是的,我确实认识到有一些包装可以用来解决我的子类中的这个问题,即通过指示stuff[]
的内容现在存储在具有不同名称的数组中。 我只是想保持这个简单,原则上我很好奇。
非常感谢提前!
我相信你必须插入一个访问器方法,即使用:
for(String p : getStuff()) {
在超类中,添加:
protected String[] getStuff() { return stuff; }
无论你在哪里有一个protected String[] stuff
重新定义。
覆盖真的适用于方法,而不是数据(至少,在Java模型中是这样;其他一些语言以不同的方式执行),因此为了获得覆盖效果,您必须设置一个方法(通常是一个简单的访问器,就像这里)。 它根本不会使事情变得复杂,它只是一种非常简单的方法来指示Java编译器本质上使用您期望的行为所需的“额外级别的间接”。
这样你就可以用定义的东西隐藏父变量。
尝试给初始化块(或构造函数)中的东西赋值:
abstract public class BasicStuff { protected String[] stuff; { stuff = new String[] { "Pizza", "Shoes" }; } public void readStuff() { for(String p : stuff) { System.out.println(p); } } }
..
public class HardStuff extends BasicStuff { { stuff = new String[] { "Harmonica", "Saxophone", "Particle Accelerator" }; } }
如果要打印派生类中定义的String Stuff数组,则需要通过重新定义HardStuff类中的方法来覆盖HardStuff类中的方法readStuff。 由于方法readStuff是在抽象类BasicStuff中定义的,因此它只会打印BasicStuff类的成员。 因此,在derieved类中添加相同的方法。 您可以在下面找到完整的代码..
class BasicStuff { protected String[] stuff = { "Pizza", "Shoes" }; public void readStuff() { for(String p : stuff) { System.out.println(p); } } } public class HardStuff extends BasicStuff { protected String[] stuff = { "Harmonica", "Saxophone", "Particle Accelerator" }; public void readStuff() { for(String p : stuff) { System.out.println(p); } } public static void main(String []arg) { HardStuff sf = new HardStuff(); sf.readStuff(); } }