2012-01-07 59 views
1

是否可以从父类中的静态方法内访问子类类常量?在静态父方法中访问子类常量

public class Model { 

    public static void someMethod(){ 
     HERE I WANT TO GET THE MODEL_NAME constant! 
    } 
} 

public class EventModel extends Model { 
    public static final String MODEL_NAME = "events"; 
} 

,并在其他一些地方,我呼吁:

EventModel.someMethod(); 
+3

举个例子。我对任何需要了解其孩子的家长保持警惕;问我的父亲。 – 2012-01-07 02:26:00

+0

在发布了我的答案后,我必须说我也同意戴夫牛顿。如果你的父类需要知道它是孩子,你可能有一个设计问题需要考虑(但并非总是......) – XIVSolutions 2012-01-07 03:26:40

+0

你能提出一个这不是设计问题的情况吗? – 2012-01-07 03:36:07

回答

3

试试吧!

如果常数被声明为private,那么没有。如果是public,那么是的,因为任何人都可以访问它。这里的父类很大程度上是无关紧要的。

class Parent { 
    public static void Foo() { 
     int x = Child.YEP; // Ok 
     int y = Child.NOPE; // Error 
    } 
} 

class Child extends Parent { 
    public static final int YEP = 42; 
    private static final int NOPE = 66; 
} 

FooParent定义,因此不能访问的Child私有成员。

这个怎么样?

class Parent { 
    abstract String getModelName(); 

    public void someMethod() { 
     String myModel = getModelName(); 
    } 
} 

class Child extend Parent { 
    String getModelName() { return "events"; } 
} 

但请注意,该方法不再公开。

+0

我已更新示例 – jonepatr 2012-01-07 02:31:46

+0

方法名**必须**以小写字母开头。 – 2012-01-07 02:42:59

+0

@rogelware说谁? – 2012-01-07 02:44:58

1

你可能会发现这更有效。

使用方法getName定义父类。请注意,如果您希望模型类公开名称属性,则此属性可以是公共的,否则,您可以将其保留为“受保护”,如我在这里。 “受保护”将使该方法在任何派生(子)类中都可见。

public class Model { 
    private static String MODEL_NAME = "Model"; 

    protected String getModelName(){ 
     return MODEL_NAME; 
    }  
} 

然后在你的子类定义的名称方法的“覆盖”:

public class EventModel extends Model 
{ 
    private static String MODEL_NAME = "events"; 

    @Override // Tells the compiler that this method OVERRIDES the parent method 
    public String getModelName(){ 
     return MODEL_NAME; 
    } 
} 

这编译和运行我怀疑你正试图acheive的方式。 。 。

编辑:哦。现在我看到了问题。错过了你需要从静态方法中引用它。 。 。

+0

上面的错误答案。我错过了你需要从父类的静态方法访问它的事实。我的错 。 。 。 – XIVSolutions 2012-01-07 03:34:26