【问题标题】:Inherit new 'instance' of a static field by deriving from base class [duplicate]通过从基类派生来继承静态字段的新“实例”[重复]
【发布时间】:2013-06-09 07:36:00
【问题描述】:

考虑以下类层次结构:

基础

基础

Base 有一个静态字段。 我希望派生类继承该静态字段,但每个类都应具有该静态字段的自己的“实例”(通过实例我的意思是有多个具有相同名称的静态字段)。所以Derived1.staticFieldDerived2.staticField 不同。我该怎么做?

希望你能理解我的问题。如果您希望我的解释得到一些代码的支持,请告诉我。

public class Base
{
    protected static String staticField = "Base";

    protected void printIt()
    {
        System.out.println(staticField);
    }
}

public class Derived1 extends Base
{
    //Override somehow
    protected static staticField = "Derived1";
}

public class Dervied2 extends Base
{
    //Override somehow
    protected static staticField = "Derived2";
}

instanceOfBase.printIt() 打印“基地”

instanceOfDerived1.printIt() 打印“Derived1”

instanceOfDerived2.printIt() 打印“Derived2”

【问题讨论】:

  • 是的,请添加代码
  • 如果有一些问题,比如你链接的问题。虚拟 getter 方法的想法很好,但有什么方法可以避免产生大量名为 staticFieldBasestaticFieldDerived1staticFieldDerived2 的静态变量?

标签: java oop


【解决方案1】:

静态方法/字段与类型绑定,因此与实例无关。

您可以将相同的静态字段添加到您的子类,但请注意这不是多态性 - 这只是隐藏。这符合静态方法不能被子类覆盖的行为。

我建议为您的解决方案尝试更好的方法;覆盖的静态字段不会为您购买多态性。

【讨论】:

    【解决方案2】:

    您不能这样做,因为静态成员并没有真正继承。继承与仅与实例相关的多态性一起出现。我认为您应该更好地解释您的实际问题,我相信我们可以建议您选择更好的设计解决方案。

    【讨论】:

      【解决方案3】:

      你不能继承任何静态的东西。它属于类型/类,而不是实例。继承可以被认为是将非私有字段/方法从父类复制到扩展它的类。

      【讨论】:

        【解决方案4】:

        您可以将“静态字段”视为一个全局变量,它甚至不是 Class 的一部分。不可能让 Derived1.staticField 与 Derived2.staticField 不同,因为静态字段就是这样设计的。

        【讨论】:

          猜你喜欢
          • 2014-04-27
          • 2010-10-05
          • 2018-05-10
          • 2018-10-04
          • 2021-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-16
          相关资源
          最近更新 更多