1

我想在牛奶类中设置名称和代码静态属性。为什么这不起作用?我什至不能覆盖名称和代码的设置器/获取器。

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

}
4

8 回答 8

7

为什么这不起作用?

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

目前尚不清楚您为什么要这样做,但基本上如果您声明一个静态变量,则只有一个变量,句号。调用Milk.setName完全等同于调用Cow.setName这里。

于 2012-10-10T16:16:01.087 回答
1

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

public class Milk extends Cow{

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

}
于 2012-10-10T16:16:49.343 回答
0

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

于 2012-10-10T16:16:47.867 回答
0

您不能继承和覆盖静态方法 - 请记住,静态方法适用于类(它们只存在于原始类中)。它们不会对任何对象进行操作(尽管您可以在参数中显式引用对象) . 他们不能使用多态性。

方法覆盖也是在编译时确定的,重载是在运行时确定的。

尽管您可以保留静态字段,因为 javac 认为它们是“常量”或常量:它们在您的程序生命周期中不会改变(您可以使用 final 修饰符更容易地判断这一点)。

私有字段也不会被继承。

于 2012-10-10T16:18:00.370 回答
0

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

于 2012-10-10T16:18:41.897 回答
0

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

-此外static成员不是多态的,只是提醒你private变量不是继承的。

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

于 2012-10-10T16:19:25.267 回答
0

静态方法不是继承的,所以它们必须在超类中被引用。使所有子类的名称和代码不同的唯一方法是让子类自己定义它们。我建议您不要完全为分层结构声明静态状态,而不是试图让它发挥作用。

于 2012-10-10T16:19:36.300 回答
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");
    }
}
于 2012-10-10T17:00:30.383 回答