为什么我们不应该为单个方法使用static和abstract?
答案 0 :(得分:7)
定义static关键字,以便可以通过类名而不是对象调用方法。这意味着该方法必须有某种定义。但抽象意味着你没有关于方法做什么的任何细节,就像它说**Abstract**
一样。继承或扩展类时,可以定义方法。
想想一个界面。
如果您在抽象类中询问静态方法,那就是另一个故事。抽象类基本上是一个接口,只包含一个say函数的模板,您必须稍后通过继承/扩展该类来实现。扩展该类后,静态方法不会随之出现(默认情况下,除非访问修饰符是公共/受保护的)。
答案 1 :(得分:5)
不继承静态方法。因此,将其抽象化是一种废话。
答案 2 :(得分:5)
abstract关键字意味着子类必须覆盖该方法 - 这是(Java)支持多态的方法之一。如果您想使子类不能覆盖该方法,则将其标记为final。所以不可能有一个“抽象的最终”方法,因为它们彼此完全相反。
static关键字也意味着final - 所有静态方法也都是final。因此,不可能有一个静态和抽象的方法,因为你可以创建一个抽象和最终的方法。
静态最终的原因是它绑定到类而不是实例。这意味着编译器在编译时而不是运行时查找它以确定调用哪个方法。这是什么原因? Java的设计者做出的任意决定 - 他们可以允许覆盖静态方法,但决定不这样做。不幸的是,我没有特别了解为什么选择其中一个而不是另一个。
答案 3 :(得分:0)
正如其他人所说,静态+抽象在Java中是无稽之谈。但是,有一些(罕见的)我希望自己可以做到这一点。
我正在寻找的结果基本上就是说......“扩展这个抽象类(或实现这个接口)的所有具体类必须提供一个带有这个签名的静态方法。”此功能将允许这些类提供有关自身的元信息。
通常我在这些情况下最终得到了一个实例方法。如果您规定具体实现必须支持默认(无参数)构造,则可以执行...
MyInterface obj = MyClassThatImplementsMyInterface.newInstance();
obj.invokeTheMethodIWishWasBothStaticAndAbstract();