【问题标题】:Java static attributes in an abstract class抽象类中的 Java 静态属性
【发布时间】:2012-10-01 04:34:44
【问题描述】:

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

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

}

【问题讨论】:

  • 那些应该是实例变量(也就是说,不是static)。

标签: java static attributes abstract


【解决方案1】:

为什么这不起作用?

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      public class Milk extends Cow{
      
      ...
      static {
              Cow.setName("asdmilk");
              Cow.setCode("KDDFA");
          }
      ...
      
      }
      

      【讨论】:

        【解决方案4】:

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

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

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

        私有字段也不会被继承。

        【讨论】:

        • 我以为牛奶类是有自己的静态名称和自己的不属于奶牛的类的静态代码。
        • 你不能继承静态方法句号。
        【解决方案5】:

        附带说明一下,您有一个类Milk,它扩展了Cow。通常extends 关键字代表一种 关系。例如,Poodle extends Dog,因为贵宾犬是狗的一种。牛奶不是牛的一种。

        【讨论】:

          【解决方案6】:

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

          - 而且static 成员不是多态的,只是提醒您private 变量是不是继承的。

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

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              【解决方案8】:

              我相信你可以使用这个想法实现你想要的:

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

              【讨论】:

                猜你喜欢
                • 2018-08-07
                • 1970-01-01
                • 1970-01-01
                • 2011-06-21
                • 1970-01-01
                • 2012-12-03
                • 1970-01-01
                • 2011-11-15
                • 1970-01-01
                相关资源
                最近更新 更多