问题是在 Java 中为什么我不能定义抽象静态方法?例如
abstract class foo {
abstract void bar( ); // <-- this is ok
abstract static void bar2(); //<-- this isn't why?
}
原文由 hhafez 发布,翻译遵循 CC BY-SA 4.0 许可协议
问题是在 Java 中为什么我不能定义抽象静态方法?例如
abstract class foo {
abstract void bar( ); // <-- this is ok
abstract static void bar2(); //<-- this isn't why?
}
原文由 hhafez 发布,翻译遵循 CC BY-SA 4.0 许可协议
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答6k 阅读
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
方法的
abstract
注释表明该方法必须在子类中被覆盖。在 Java 中,一个
static
成员(方法或字段)不能被子类覆盖(这在其他面向对象语言中不一定正确,请参阅 SmallTalk。)static
成员可能被 隐藏,但这与 overridden 根本不同。由于不能在子类中覆盖静态成员,因此不能对它们应用
abstract
注解。顺便说一句 - 其他语言确实支持静态继承,就像实例继承一样。从语法的角度来看,这些语言通常要求在语句中包含类名。例如,在 Java 中,假设您在 ClassA 中编写代码,这些是等效的语句(如果 methodA() 是静态方法,并且没有具有相同签名的实例方法):
和
在 SmallTalk 中,类名不是可选的,所以语法是(注意 SmallTalk 不使用 . 来分隔“主题”和“动词”,而是将其用作语句结束符):
因为总是需要类名,所以总是可以通过遍历类层次结构来确定方法的正确“版本”。对于它的价值,我确实偶尔会错过
static
继承,并且在我第一次开始使用它时被 Java 中缺乏静态继承所困扰。此外,SmallTalk 是鸭子类型的(因此不支持按合同编程。)因此,它没有abstract
类成员修饰符。