为什么Java里面的静态方法不能是抽象的?
问题是为什么Java里面不能定义一个抽象的静态方法?例如:
abstract class foo {abstract void bar( ); // <-- this is okabstract 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