在Java中继承静态变量

4
我希望有以下设置:
abstract class Parent {
    public static String ACONSTANT; // I'd use abstract here if it was allowed

    // Other stuff follows
}

class Child extends Parent {
    public static String ACONSTANT = "some value";

    // etc
}

这在Java中是否可能?如何实现?如果可以避免使用实例变量/方法,我更愿意这样做。

谢谢!

编辑:

常量是数据库表的名称。每个子对象都是一个小型ORM。


4
如果你要避开面向对象的部分,为什么还要使用面向对象编程语言呢?(这句话有点离题,但我会尽力保持翻译准确) - Travis Gockel
但是你想要实现什么目标呢?不为Child类创建一个对象吗?创建静态同样也很昂贵。 - zengr
你能举个例子说明如何使用它吗? - Greg Hewgill
我有我的理由,但它们在公共论坛上可能不受欢迎。该程序很小,这个数据不太可能改变或需要特殊的访问器,并且我来自一种感觉更自然的不同语言。我不是在试图避免对象,只是试图将KISS应用于我的程序设计并保持字数减少。相信我,我有很多对象。 - SapphireSun
1
可能吗?是的,但肯定有更好的方法。给出更多背景信息,你会得到更好的答案,并在此过程中学到一些东西。 - Pablo Fernandez
我喜欢JavaScript..因为基于原型的面向对象编程允许使用这些伟大的东西。 - clancer
2个回答

18

你不能完全按照你想要的方式来做。也许一个可以接受的妥协方案是:

abstract class Parent {
    public abstract String getACONSTANT();
}

class Child extends Parent {
    public static final String ACONSTANT = "some value";
    public String getACONSTANT() { return ACONSTANT; }
}

如果有很多子类怎么办?有没有比将相同的getACONSTANT()方法复制粘贴到每个子类中更清晰的方法? - Chiubaka
@ChiuBaka - 创建一个适配器类,即实现该方法并扩展适配器类。https://dev59.com/6Gkw5IYBdhLWcg3wDWPL - david blaine

2
在这种情况下,你需要记住的是在Java中你无法重写静态方法。实际上它会隐藏它。 根据你提供的代码,如果你进行以下操作,答案将是null。
Parent.ACONSTANT == null ; ==> true

Parent p = new Parent(); p.ACONSTANT == null ; ==> true

Parent c = new Child(); c.ACONSTANT == null ; ==> true

只要您使用Parent作为参考类型,ACONSTANT将为空。
让您可以像这样做。
 Child c = new Child();
 c.ACONSTANT = "Hi";
 Parent p = c;
 System.out.println(p.ACONSTANT);

输出结果将为 null。


哇,很棒的例子。感谢您抽出时间发布它 :-) +1 - SapphireSun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接