如何确保继承的静态字段始终从子类而不是基类获取其值?

时间:2011-08-22 13:56:44

标签: java inheritance static

我正在尝试将hello方法放在基类A中,我希望它显示在子类中设置的x的值。

hello实例永远不会调用A方法 - 此类是纯基类,并且从不实例化。

x变量是一个分类器,用于表示调用hello方法的位置(此值实际上是持久保存到数据库中);

如果在子类中调用hello,那么如何确保x的值是子类中设置的值?

public class A{

  protected static String x = "A";

  public void hello(){
    System.out.println(x);
  }
}

public class B extends A{

  protected static String x = "B";

  //...
  hello();
}

public class C extends A{

  protected static String x = "C";

  //...
  hello();
}

3 个答案:

答案 0 :(得分:4)

你做不到。你试图从字段中获得多态行为,但它们根本不是多态的。 x中的hello()在编译时绑定到A中的字段。

如果你想要多态行为,你需要引入一个非final(可能是抽象的)方法并在每个子类中覆盖它。然后hello()可以调用此方法,并且多态将确保调用正确的覆盖。当然,hello()不能是静态方法,因为多态不适用于静态方法...方法调用的目标(你调用它的对象)将确定使用的实现。

答案 1 :(得分:2)

我会做一些改变:

首先,制作课程A abstract。这将确保它永远不会被实例化。

其次,我会将您的protected static变量更改为类A中的抽象方法。

所以,你会:

protected String x();
课程A中的

。然后你将被迫在子类中实现它:

@Overrides
protected String x() {
   return "B";
}

答案 2 :(得分:0)

您无法覆盖静态变量,实际上您无法覆盖任何变量。覆盖用于方法,隐藏用于变量。

要做你想做的事(我认为),在你的类构造函数中,将私有变量(摆脱静态)设置为“A”,“B”,“C”。摆脱B类和C类的字符串。