为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

人到中年有点甜 2019-08-09 10:48:54
为什么静态方法在Java中不能是抽象的问题是在Java中为什么我不能定义一个抽象的静态方法?例如abstract class foo {    abstract void bar( ); // <-- this is ok    abstract static void bar2(); //<-- this isn't why?}
查看完整描述

3 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

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


查看完整回答
反对 回复 2019-08-09
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

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


查看完整回答
反对 回复 2019-08-09
?
慕虎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类成员的修饰符。


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 847 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号