在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配置和反射。
是否有可以实现此目的的修饰符?
是的,我确实认识到有一些包装可以用来解决我的子类中的这个问题,即通过指示stuff[]
的内容现在存储在具有不同名称的数组中,例如。我只是想保持这个简单,原则上很好奇。
提前多多感谢!
答案 0 :(得分:13)
我相信你必须插入一个访问器方法,即使用:
for(String p : getStuff()) {
在超类中,并添加:
protected String[] getStuff() { return stuff; }
只要你有protected String[] stuff
重定义。
覆盖确实适用于方法,而不是数据(至少在Java模型中是这样;其他一些语言以不同的方式执行),因此为了获得覆盖效果,您必须设置方法(通常是一个简单易用的存取器,就像这里一样)。它根本不会使事情变得复杂,它只是一种非常简单的方法来指示Java编译器本质上使用您期望的行为所需的“额外级别的间接”。
答案 1 :(得分:4)
这样你就可以隐藏带有定义内容的父变量。
尝试给初始化块(或构造函数)中的东西赋值:
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" };
}
}
答案 2 :(得分:0)
如果要打印派生类中定义的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();
}
}