为什么Java里面的静态方法不能是抽象的

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

问题是为什么Java里面不能定义一个抽象的静态方法?例如:

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

回答一

因为抽象的意思是”不实现任何功能“,而静态的意思是”无论你有没有一个对象实例,都要这个功能“,所以说它们逻辑上就是矛盾的。

回答二

抽象这个符号表示这个方法一定要在子类里面覆写

在Java里面静态成员(域和方法)不能被子类覆写(这不一定是绝对成立在别的面向对象的语言中,像SmallTalk)一个静态成员可能被隐藏起来,但是和覆写在本质上是不同的。

因为静态成员不能在子类里面被覆写,abstrac就不可能修饰它们了

顺便说一下,其他语言支持静态继承,就像实例继承那样。从语法的角度来看,这些语言通常要求类名被包括在语句里面。例如Java里面,假如你在写A类的代码,这些语句都是等价的(如果methodA() 是一个静态的方法,并且没有任何实例对象也具有有相同的签名):

ClassA.methodA();
methodA();

在SmallTalk里面,类名不是可选的,所以这个语法是(注意:SmallTalk不用.去分割主语和动词的,而是用它作为中止符号)

ClassA methodA.

因为这个类名是必须的,所以可以通过遍历这个类的层次结构去决定这个类的正确版本。值得一提的是,我会偶然错过静态继承,并且我刚开始使用Java时,就因为缺少静态继承而痛苦。另外,SmallTalk是鸭子类型的(因此是不支持契约编程的)。因此它没有对类成员的抽象修饰符。

文章翻译自Stack Overflow:https://stackoverflow.com/questions/370962/why-cant-static-methods-be-abstract-in-java

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值