为什么静态方法在Java中不能是抽象的问题是在Java中为什么我不能定义一个抽象的静态方法?例如abstract class foo { abstract void bar( ); // <-- this is ok abstract static void bar2(); //<-- this isn't why?}
3 回答

犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
语言设计不佳。直接调用静态抽象方法比仅使用该抽象方法创建实例会更有效。当使用抽象类作为枚举无法扩展的变通方法时尤其如此,这是另一个糟糕的设计示例。希望他们在下一个版本中解决这些限制。

慕虎7371278
TA贡献1802条经验 获得超4个赞
abstract
方法的注释表明该方法必须在子类中重写。
在Java中,static
子类不能覆盖成员(方法或字段)(在其他面向对象的语言中不一定如此,请参阅SmallTalk。)static
成员可能被隐藏,但这与被覆盖的根本不同。
由于静态成员无法在子类中重写,abstract
因此无法将注释应用于它们。
另外 - 其他语言确实支持静态继承,就像实例继承一样。从语法的角度来看,这些语言通常需要将类名包含在语句中。例如,在Java中,假设您在ClassA中编写代码,这些是等效语句(如果methodA()是静态方法,并且没有具有相同签名的实例方法):
ClassA.methodA();
和
methodA();
在SmallTalk中,类名不是可选的,因此语法是(请注意,SmallTalk不使用。来分隔“主题”和“动词”,而是将其用作statemend终结符):
ClassA methodA.
由于始终需要类名,因此始终可以通过遍历类层次结构来确定方法的正确“版本”。对于它的价值,我偶尔会错过static
继承,并且当我第一次开始使用Java时,由于缺乏静态继承而被咬了。另外,SmallTalk是鸭子类型(因此不支持逐个程序。)因此,它没有abstract
类成员的修饰符。
添加回答
举报
0/150
提交
取消