小编典典

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

all

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

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

阅读 140

收藏
2022-03-04

共1个答案

小编典典

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

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

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

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

ClassA.methodA();

methodA();

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

ClassA methodA.

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

2022-03-04