覆盖子类中的成员数据,在超类实现中使用?

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)

...打印PizzaShoes.我想让它打印后者.

我认识到这是一个相当差的等级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编译器本质上使用您期望的行为所需的"额外级别的间接".