我正在尝试将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();
}
答案 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类的字符串。