我正在努力实现以下目标:
我有一个具有某些逻辑的父类。在子类中,我“重新定义”常量/属性。有什么方法可以使父类中定义的方法访问子属性?或者更具体地说-在下面的示例中,是否有任何方法可以强制“ out”方法编写 extended 而不是 base ?
public class BaseTest {
public static final String x = "base";
public void out() {
System.out.println(x);
}
}
public class ExtendedTest extends BaseTest{
public static final String x = "extended";
}
public class Main {
public static void main(String[] args) {
BaseTest base = new BaseTest();
ExtendedTest extended = new ExtendedTest();
base.out(); // base (as expected)
extended.out(); // base (extended expected)
System.out.println(extended.x); // extended (as expected)
}
}
我主要来自PHP领域,这种方法很好用。 Dunno,如果我缺少什么,或者Java的设计不允许这样做。
谢谢。
注意:不管该属性是否为静态,这都不重要。我只是想能够覆盖子类中的任何类型的属性(就像我可以覆盖方法一样),根据我到目前为止所获得的答案,这似乎在Java中是不可能的。在PHP中绝对有可能,这就是为什么我问这个问题。
答案 0 :(得分:4)
static
字段不受继承。 x
方法主体中的out()
指向BaseTest.x
。由于您没有覆盖out()
,因此out()
方法的主体仍会打印BaseTest.x
的值。
答案 1 :(得分:1)
静态成员在编译时被解析,并且添加var btn = document.createElement("div");
btn.id = "cvtoggle";
btn.classList.add("G-Ni","J-J5-Ji");
btn.innerHTML = "Settings";
btn.setAttribute("onclick", "window.location.href = 'https://mail.google.com'+window.location.pathname+'#settings/general';");
document.getElementsByClassName("Cr aqJ")[0].prepend(btn)
不会影响还存在的ExtendedTest.x
,这是BaseTest.x
方法所链接的。
要完成所需的工作,您需要一个重写的方法:
BaseTest#out()
此模式通常与基类或接口中的抽象方法一起使用,要求子类定义诸如名称或键之类的属性。