【问题标题】:public abstract static method - why not allowed? [duplicate]公共抽象静态方法 - 为什么不允许? [复制]
【发布时间】:2013-09-15 13:22:47
【问题描述】:

我想要拥有所有具有相同方法的类家族。由于此方法非常简单,我想将其设为最终静态,例如

class A {
   public static final String createSth () { }
}

(实际上这个方法只返回字符串)。

有时使用相同的方法对所有 A、B、C 类进行大转换会很有用。因此我想创建母班。

class abstract Mother {
       public static abstract String createSth () { }
}

然后为我的所有 A、B、C 类 ex 添加适当的扩展。 A 类扩展了母亲。

不幸的是,Java 不允许这样做。我想知道为什么?

当然,我可以删除 static final 修饰符,然后一切正常。但是另一方面,如果每个子类都返回一个不能以任何方式修改的常量 String,为什么不呢?

你可以问这样的构造的目的是什么?

我只是想创建数据库 sql 字符串。对于每个表,我创建了一个单独的类,作为 createSth 方法的结果,我想返回为该类创建表的 sql。

接口也无济于事。

唯一的解决方案似乎是从 Mother 类的 createSth 方法中删除抽象修饰符。但是后来我不允许对 Mother 类进行大写并为孩子调用 createSth 方法。所以我必须删除子类的静态修饰符。

总结为什么不允许抽象方法是静态的?好的,到这里我也能理解了,但是为什么非静态抽象方法不允许被子类中的静态方法替换呢?

【问题讨论】:

  • 返回一个不能“以任何方式修改”的字符串有什么关系?你认为方法的 final 修饰符有什么作用?
  • 抽象静态方法的目的是什么?

标签: java


【解决方案1】:

static 方法(就像 finalprivate)不能被覆盖,因此无法在派生类中实现它们,因此将它们设置为 abstract 没有意义。

【讨论】:

    【解决方案2】:

    静态方法不会被继承,因此将它们抽象化将毫无意义。

    【讨论】:

      【解决方案3】:

      final 方法没有得到overridden

      static 方法不会得到overridden,但它们可以是子类中的hidden

      【讨论】:

        猜你喜欢
        • 2017-05-27
        • 2016-07-28
        • 1970-01-01
        • 1970-01-01
        • 2011-12-11
        • 1970-01-01
        • 2011-07-08
        • 2015-02-06
        • 1970-01-01
        相关资源
        最近更新 更多