【问题标题】:Static variables inheritance in JavaJava中的静态变量继承
【发布时间】:2012-02-07 11:31:32
【问题描述】:
public class Base{
        protected String str;

    public static final Base ERROR = new Base("error");
...
}

public class Derived extends Base{
        public static final Derived OTHER = new DERIVED("other");
        public Derived(String str) {
        super(str);
        }
    }

Derived page = Derived.OTHER; //OK
page = (Drived)Derived.ERROR; //ClassCastException

那么我可以将静态成员变量从 Base 转换为 Derived 类吗?

【问题讨论】:

  • 在投射时这是一个很好的做法,使用 instanceOf 来验证投射是否合适。

标签: java inheritance static


【解决方案1】:

你不能。

无法将Derived.ERROR 转换为Derived,因为它不是Derived 的实例。这是Base 的一个实例。

认识到Base.ERRORDerived.ERROR 是指同一个对象的两种方式可能有助于消除混淆。

【讨论】:

    【解决方案2】:

    Derived.ERRORBase.ERROR 引用完全相同的对象,并且该对象属于Base 类,因此它不能转换为Derived

    【讨论】:

      【解决方案3】:

      不能将父级强制转换为子级。这可以通过下面的例子来简单理解:

      public class Parent
      {
          public void parentMethod() { }
      }
      
      
      public class Child extends Parent
      {
          public void childMethod() { }
      }
      
         .....
      Parent parent = new Parent();
      

      所以如果我们能够将Parent 对象转换为Child,这意味着我们可以在parent 对象上调用childMethod(),这是不正确的,因为对象parent 的类型是Parent没有childMethod() 方法。

      我希望我的解释不会令人困惑。

      【讨论】:

        【解决方案4】:

        静态变量不绑定到实例,而是绑定到类

        【讨论】:

          【解决方案5】:

          不...您不能这样做..因为您必须使其成为派生类的实例..而不是基类

          【讨论】:

            猜你喜欢
            • 2019-04-28
            • 2011-04-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-29
            • 2020-10-18
            • 1970-01-01
            相关资源
            最近更新 更多