【问题标题】:Accessing sub class static attributes from superclass method [duplicate]从超类方法访问子类静态属性[重复]
【发布时间】:2021-11-04 03:30:38
【问题描述】:

我将举一个简单的例子,因为以这种方式查看并不那么复杂。下面示例的输出将为空:

abstract class SuperClass { // it doesn't need to be abstract but that's my case now
    // needs to be static
    static String var_name = null;
    void method(){
        System.out.println(var_name);
    }
}
class subclass{
    // needs to be static
    static String var_name = "I need to print this"
    void otherUnrelatedMethod(){
        method(); // calling method() here gives me null
    }
}

我知道实现我想要的两个选项:

我可以通过将 var_name 作为参数传递给 method() 轻松实现这一点,这是我现在正在使用的选项。

我也可以重写method(),但是这样做会带来很多工作,因为有很多子类,而且method()实际上很大。

除了这两个,还有其他选择吗?即:如果我可以使用带有子类类型<S extends SuperClass> 的边界来获得理想的效果。甚至使用反射,虽然我听说它会使程序变得很慢

【问题讨论】:

  • 您能否创建另一个方法getVarName() 以返回var_name,然后在子类中覆盖该方法?
  • @Progman 我不知道...也许吧?我期待具有反射或与子类类型绑定的东西。我想我会关闭它,因为这种 Java 的不灵活性让我很生气。

标签: java abstract-class


【解决方案1】:

这是解决这类问题的一个很好的模式:

abstract class SuperClass { 
    String var_name() {
        return null;
    }

    void method() {
        System.out.println(this.var_name());
    }
}

class subclass extends SuperClass {
    @Override
    String var_name() {
        return "I need to print this";
    }

    void otherUnrelatedMethod() {
        method(); 
    }
}

  • 首先,超类没有关于子类的信息。这意味着您不能从超类调用子类函数。
  • 其次,static 成员存在于class 中,而不是实例中。这是不可能的,但如果一个子类覆盖任何超类静态成员,其他子类将成为受害者。

您最好使用从子类返回var_name@Override 的函数。

【讨论】:

  • 对不起,函数不是静态的...
  • 是的,我一尝试编译您的解决方案就注意到了。问题是我也将此值用于静态方法。我将编辑我的帖子以澄清。
  • @JãoSchmidt 我也编辑了我的答案。 static 不是为了你想做的事。
猜你喜欢
  • 2018-08-18
  • 2013-03-24
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
相关资源
最近更新 更多