2010-10-12 103 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