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