为什么静态方法在 Java 中不能是抽象的?

新手上路,请多包涵

问题是在 Java 中为什么我不能定义抽象静态方法?例如

abstract class foo {
    abstract void bar( ); // <-- this is ok
    abstract static void bar2(); //<-- this isn't why?
}

原文由 hhafez 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 417
2 个回答

方法的 abstract 注释表明该方法必须在子类中被覆盖。

在 Java 中,一个 static 成员(方法或字段)不能被子类覆盖(这在其他面向对象语言中不一定正确,请参阅 SmallTalk。) static 成员可能被 隐藏,但这与 overridden 根本不同。

由于不能在子类中覆盖静态成员,因此不能对它们应用 abstract 注解。

顺便说一句 - 其他语言确实支持静态继承,就像实例继承一样。从语法的角度来看,这些语言通常要求在语句中包含类名。例如,在 Java 中,假设您在 ClassA 中编写代码,这些是等效的语句(如果 methodA() 是静态方法,并且没有具有相同签名的实例方法):

 ClassA.methodA();

methodA();

在 SmallTalk 中,类名不是可选的,所以语法是(注意 SmallTalk 不使用 . 来分隔“主题”和“动词”,而是将其用作语句结束符):

 ClassA methodA.

因为总是需要类名,所以总是可以通过遍历类层次结构来确定方法的正确“版本”。对于它的价值,我确实偶尔会错过 static 继承,并且在我第一次开始使用它时被 Java 中缺乏静态继承所困扰。此外,SmallTalk 是鸭子类型的(因此不支持按合同编程。)因此,它没有 abstract 类成员修饰符。

原文由 Jared 发布,翻译遵循 CC BY-SA 3.0 许可协议

因为“抽象”的意思是:“不实现任何功能”,而“静态”的意思是:“即使没有对象实例也有功能”。这是一个逻辑上的矛盾。

原文由 Tomalak 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题