访问扩展类中的属性/常量

时间:2019-02-18 09:24:12

标签: java inheritance

我正在努力实现以下目标:

我有一个具有某些逻辑的父类。在子类中,我“重新定义”常量/属性。有什么方法可以使父类中定义的方法访问子属性?或者更具体地说-在下面的示例中,是否有任何方法可以强制“ 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中绝对有可能,这就是为什么我问这个问题。

2 个答案:

答案 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()

此模式通常与基类或接口中的抽象方法一起使用,要求子类定义诸如名称或键之类的属性。