簡體   English   中英

抽象類中的Java靜態屬性

[英]Java static attributes in an abstract class

我想在milk類中設置名稱和代碼靜態屬性。 為什么不起作用? 我什至無法覆蓋名稱和代碼的設置方法。

    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");
        }
..

}

為什么不起作用?

每個Cow子類都沒有一組靜態變量,並且根本無法覆蓋靜態方法。 靜態成員基本上不是多態的。

目前尚不清楚為什么要嘗試執行此操作,但是基本上,如果您聲明一個靜態變量,則只有一個變量,即句號。 調用Milk.setName等同於在此處調用Cow.setName

靜態方法setName和setCode位於Cow中,而不存在於Milk中。 你應該說

public class Milk extends Cow{

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

}

您可以將靜態獲取器和設置器更改為普通獲取器,設置器。 但是請保持可變性為靜態。

您不能繼承並覆蓋靜態方法-請記住,靜態方法適用於類(它們僅存在於原始類中)。它們不能對任何對象進行此類操作(盡管您可以在參數中顯式引用對象) 。 他們不能使用多態。

同樣,方法覆蓋是在編譯時確定的,重載是在運行時確定的。

盡管您可以像javac所認為的那樣將靜態字段保持為“常量”或常量:在程序生命周期中它們不會改變(您可以使用final修飾符更容易地判斷這一點)。

私有字段也不被繼承。

附帶說明一下,您擁有一類延伸Cow Milk 通常情況下, extends的關鍵字代表類型的關系。 例如, Poodle extends Dog因為貴賓犬是“狗”的一種。 牛奶不是牛的一種。

- static變量是One per Class ,所有對象都共享。

-而且, static成員不是多態的 ,只是提醒您private變量不是繼承的

-因此您不能覆蓋靜態方法。

靜態方法不會被繼承,因此必須在超類中引用它們。 使所有子類的名稱和代碼不同的唯一方法是讓子類自己定義它們。 我建議您不要完全聲明分層結構的靜態狀態,而不要嘗試使之起作用。

我相信您可以使用此想法實現您想要的:

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");
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM