2010-10-12 73 views
4

一个静态变量,我想有以下设置:继承在Java中

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

题外话,但为什么要使用面向对象的编程语言,如果你要避免面向对象的部分? – 2010-10-12 02:34:23

+0

但你想达到什么目的?不为Child类创建一个obj,创建静态代码同样很昂贵。 – zengr 2010-10-12 02:35:56

+0

你能举一个例子说明你如何使用那个? – 2010-10-12 02:36:12

回答

18

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

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

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

这太棒了!谢谢! – SapphireSun 2010-10-12 02:48:31

+0

如果有很多子类会怎么样?有没有比将每个子类中的getACONSTANT()方法复制粘贴的方法更简单的方法? – Chiubaka 2013-03-12 21:53:08

+0

@ChiuBaka - 创建一个适配器类,即实现该方法并扩展适配器类的适配器类。 http://stackoverflow.com/questions/10170698/what-is-adapter-class – 2013-04-17 01:36:58

2

在这种情况下,你必须记住是在java中你不能过度使用静态方法。发生了什么事是它隐藏的东西。根据您做以下事情回答将是无效

Parent.ACONSTANT == null ; ==> true 

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

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

只要你用家长为引用类型ACONSTANT将是空的,你已经把代码

让我们来做这样的事情吧。

Child c = new Child(); 
c.ACONSTANT = "Hi"; 
Parent p = c; 
System.out.println(p.ACONSTANT); 

输出将为空。

+0

哇,很酷的例子。感谢您花时间发布:-) +1 – SapphireSun 2010-10-12 04:24:26