2012-10-10 150 views
1

我想在牛奶類中設置名稱和代碼靜態屬性。 爲什麼不能工作? 我甚至不能重寫名字和代碼的setter/getters。抽象類中的Java靜態屬性

public abstract class Cow { 
     private static String name; 
     private static String code; 

    ... 
    public static String getName() { 
      return name; 
     } 

     public static void setName(String name) { 
      Cow.name = name; 
     } 

     public static String getCode() { 
      return code; 
     } 

     public static void setCode(String code) { 
      Cow.code = code; 
     } 
    ... 
    } 

public class Milk extends Cow{ 

... 
    static { 
      Milk.setName("asdmilk"); 
     Milk.setCode("KDDFA"); 
     } 
.. 

} 
+0

那些也許應該是實例變量(即不'static')。 – GriffeyDog

回答

6

爲什麼不這項工作?

您沒有在Cow的每個子類中獲得一組靜態變量,而且您根本無法重寫靜態方法。靜態成員基本上不是多態的。

目前尚不清楚爲什麼你要做到這一點,但基本上如果你聲明一個靜態變量,有一個變量,句號。撥打Milk.setName與此處致電Cow.setName完全相同。

0

您將靜態獲得者和設置者更改爲普通獲取者,設置者。但保持變量靜態。

1

靜態方法setName和setCode活在Cow中,而不是在Milk中。你應該說

public class Milk extends Cow{ 

... 
static { 
     Cow.setName("asdmilk"); 
     Cow.setCode("KDDFA"); 
    } 
... 

} 
0

你不能繼承,比超越控制靜態方法 - 請記住,靜態方法是類(它們只生活在原始類),他們沒有任何對象作爲這樣的操作(你可以顯式引用參數中的對象)。他們不能使用多態。

另外,方法overiding在編譯時確定,而在運行時確定重載。

雖然你可以保留靜態字段,因爲javac認爲它們是'常量'或常量:它們在整個程序生命中都不會改變(你可以用最終修飾符更容易地判斷它)。

私有字段也不被繼承。

+0

我以爲奶類是什麼時候製成的它擁有一個自己的靜態名稱和一個靜態代碼,用於它自己的類,它不屬於母牛。 – user1707095

+0

您不能繼承靜態方法句號。 –

0

作爲便箋,您有一個類Milk其擴展Cow。通常,extends關鍵字代表類型的關係。例如,Poodle extends Dog因爲貴賓犬是一種狗。牛奶不是一種牛。

0

-static變量爲One per Class,它由所有對象共享。

-此外static成員並不多態,只是提醒你private變量不繼承

-所以你不能重寫靜態方法。

0

靜態方法不被繼承,所以它們必須在超類中被引用。讓所有子類的名稱和代碼都不同的唯一方法是讓子類自己定義它們。我建議您遠離爲分層結構完全聲明靜態,而不是試圖使其工作。

0

我相信你能實現你想要使用的是什麼這樣的想法:

public abstract class Cow { 

protected static HashMap<String, String> names; 
protected static HashMap<String, String> codes; 

//... 

    public static String getName(String key) { 
      return (String) names.get(key); 
     } 

     public static void setName(String key, String name) { 
      names.put(key, name); 
     } 

     public static String getCode(String key) { 
      return (String) codes.get(key); 
     } 

     public static void setCode(String code) { 
      codes.put(key, name); 
     } 

     protected void initialize() 
     { 
      setName("Cow", "foo"); 
      setCode("Cow", "bar"); 
     } 

     protected static void initializeClass() 
     { 
      initialize(); 
     } 
} 

public class Milk extends Cow { 
    protected void initialize() 
    { 
     setName("asdmilk"); 
     setCode("KDDFA"); 
    } 
}