我有一个超级类和一堆子类。我想在每个子类中都有一个名称相同的字段,但是我不希望在超类中定义它,或者至少我不想使用该值。这就是我现在所拥有的
public abstract class Big {
public String tellMe = "BIG";
public Big() {}
public void theMethod() {
System.out.println ("Big was here: " + tellMe() + ", " + tellMe);
}
public String tellMe() {
return tellMe;
}
}
public class Little extends Big{
public String tellMe = "little";
public Little(){}
public String tellMe() {
return "told you";
}
public static void main(String [] args) {
Little l = new Little();
l.theMethod();
}
}
当我运行Little时,这是输出
大在这里:告诉你,大
我不确定为什么在TellMe提到“BIG”时会打印出“告诉您”的字样。两者怎么都成立?
我的问题是我希望方法tellMe()在Big中,并在所有子类中定义变量TellMe(它将实际上返回)。我可以通过使用每个子类中的tellMe()方法来使它正常工作的唯一方法是如我所写的。但这不会破坏继承的全部目的吗???请帮忙
编辑:我不在子类中使用构造函数。我想要的是一个可以在所有子类中设置的字段,以及一个使用这些值的超级方法。我不明白为什么这样做是不可能的,因为每个子类都必须实现它,所以这是有道理的……如果根本不可能,请告诉我
最佳答案
与方法不同,字段不是虚拟的。因此,在字段中声明与层次结构中另一个类中的字段同名的字段是一个坏主意。 theMethod
中引用的字段始终来自Big
(即,当您声明一个具有相同名称的字段时,当位于替换类的范围内时,它只会隐藏旧字段,但不会替换它)。
一种解决方案是重写一种从当前类获取字段的方法:
在theMethod
中,将tellMe
字段替换为getTellMe()
,并为所有类覆盖getTellMe()
以返回正确的值(或隐藏超类字段的字段)。