我想在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");
}
..
}
答案 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");
}
}