4

在 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();

... 打印PizzaShoes. 我希望它打印后者。

我认识到这是相当糟糕的分层 OO 实践;我需要它来处理一个非常具体的情况,因为我正在使用 XML 配置和反射做一些事情。

有没有可以使这种情况发生的修饰符?

是的,我确实认识到在我的子类中可以使用一些包装器来解决这个问题,例如,通过指示 的内容stuff[]现在存储在具有不同名称的数组中。我只是想保持简单,原则上很好奇。

提前非常感谢!

4

3 回答 3

13

我相信你必须插入一个访问器方法,即使用:

    for(String p : getStuff()) { 

在超类中,并添加:

    protected String[] getStuff() { return stuff; }

无论您有什么protected String[] stuff重新定义。

覆盖确实适用于方法,而不是数据(至少,在 Java 模型中是这样;其他一些语言做的事情不同),因此要获得覆盖效果,您必须插入一个方法(通常是一个非常简单的访问器,就像这里)。它根本不会使事情复杂化,它只是一种非常简单的方法,可以指示 Java 编译器本质上使用您所需行为所需的“额外间接级别”。

于 2009-09-19T17:10:05.903 回答
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" };
  }
}
于 2009-09-19T17:03:48.227 回答
0

如果要打印派生类中定义的 String Stuff 的数组,则需要通过重新定义 HardStuff 类中的方法来覆盖 HardStuff 类中的方法 readStuff。由于 readStuff 方法是在抽象类 BasicStuff 中定义的,因此它只会打印 BasicStuff 类的成员。因此,在派生类中也添加相同的方法。您可以在下面找到完整的代码..

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();
    }
}
于 2014-07-26T18:04:12.050 回答