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