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

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

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


abstract class foo {

    abstract void bar( ); // <-- this is ok

    abstract static void bar2(); //<-- this isn't why?

}


人到中年有点甜
浏览 848回答 3
3回答

慕标琳琳

因为“abstract”意味着:“实现没有功能”,“静态”意味着:“即使你没有对象实例也有功能”。这是一个合乎逻辑的矛盾。

犯罪嫌疑人X

语言设计不佳。直接调用静态抽象方法比仅使用该抽象方法创建实例会更有效。当使用抽象类作为枚举无法扩展的变通方法时尤其如此,这是另一个糟糕的设计示例。希望他们在下一个版本中解决这些限制。

慕虎7371278

abstract方法的注释表明该方法必须在子类中重写。在Java中,static子类不能覆盖成员(方法或字段)(在其他面向对象的语言中不一定如此,请参阅SmallTalk。)static成员可能被隐藏,但这与被覆盖的根本不同。由于静态成员无法在子类中重写,abstract因此无法将注释应用于它们。另外 - 其他语言确实支持静态继承,就像实例继承一样。从语法的角度来看,这些语言通常需要将类名包含在语句中。例如,在Java中,假设您在ClassA中编写代码,这些是等效语句(如果methodA()是静态方法,并且没有具有相同签名的实例方法):ClassA.methodA();和methodA();在SmallTalk中,类名不是可选的,因此语法是(请注意,SmallTalk不使用。来分隔“主题”和“动词”,而是将其用作statemend终结符):ClassA&nbsp;methodA.由于始终需要类名,因此始终可以通过遍历类层次结构来确定方法的正确“版本”。对于它的价值,我偶尔会错过static继承,并且当我第一次开始使用Java时,由于缺乏静态继承而被咬了。另外,SmallTalk是鸭子类型(因此不支持逐个程序。)因此,它没有abstract类成员的修饰符。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java