2012-01-07 75 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