抽象类中的Java静态属性

时间:2012-10-10 16:13:28

标签: java static attributes abstract

我想在milk类中设置名称和代码静态属性。 为什么这不起作用? 我甚至无法覆盖名称和代码的setter / getters。

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

}

8 个答案:

答案 0 :(得分:7)

  

为什么这不起作用?

每个Cow的子类都没有获得一组静态变量,并且根本无法覆盖静态方法。静态成员基本上不是多态的。

为什么你试图这样做是不明确的,但基本上如果你宣布一个静态变量,那就是一个变量,完全停止。调用Milk.setName完全等同于在此处调用Cow.setName

答案 1 :(得分:1)

静态方法setName和setCode存在于Cow中,而不是在Milk中。你应该说

public class Milk extends Cow{

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

}

答案 2 :(得分:0)

您将静态getter和setter更改为普通的getter,setter。但要将变量保持为静态。

答案 3 :(得分:0)

你不能继承而不是覆盖静态方法 - 请记住,静态方法适用于类(它们只存在于原始类中)。它们不能对任何对象进行操作(你可以显式地引用一个对象)尽管如此)。他们无法使用多态性。

在编译时确定方法重叠,在运行时确定重载。

虽然你可以保持静态字段,因为javac认为它们是'常数'或常数:它们在整个程序生命中不会改变(你可以用最终修饰符更容易地判断它)。

私人字段也不会被继承。

答案 4 :(得分:0)

作为旁注,您有一个Milk课程,其范围为Cow。通常,extends关键字代表类型的关系。例如,Poodle extends Dog因为贵宾犬是一种狗。牛奶不是一种牛。

答案 5 :(得分:0)

- static变量为One per Class,由所有对象共享。

- 此外static成员不是多态,只是为了提醒您private变量未继承

- 所以不能覆盖静态方法。

答案 6 :(得分:0)

静态方法不是继承的,因此必须在超类中引用它们。获取所有子类的名称和代码的唯一方法是让子类自己定义它们。我建议你完全不要为层次结构声明静态,而不是试图让它工作。

答案 7 :(得分: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");
    }
}