小编典典

为什么不能实现类将覆盖方法定义为静态方法?

java

我很困惑为什么不允许以下内容:

public interface MyInterface {
  MyInterface getInstance(String name);
}

public class MyImplementation implements MyInterface {
  public MyImplementation(String name) {
  }
  @Override
  public static MyInterface getInstance(String name) { // static is not allowed here
    return new MyImplementation(name)
  }
}

我知道为什么接口中的方法不能是静态的,但是为什么覆盖方法不能是静态的?

我希望所有类都可以实现该getInstance(String name)方法,但目前仅限于如果已经实例化了该对象而无法调用该方法,则只能调用该方法…


**_更新: _ 感谢您的回答,我现在对此有了更好的了解。基本上,我不应该尝试使实用程序类(或与此相关的工厂类)实现接口(或者至少不是这样)。


阅读 216

收藏
2020-11-01

共1个答案

小编典典

在Java中调用静态方法要求您指定确切的类型。无法多态调用静态方法,从而消除了对的需求@Override

请注意,这种方法并非在所有语言中都通用:例如,您可以在Objective-C中覆盖 类方法
,并且Apple的可可框架很好地利用了这种机制来自定义其“工厂”类。但是,在Java中,C ++和C#类方法不支持多态行为。

从理论上讲,static如果实现无需从实例访问状态,则Java设计人员可以让您通过方法提供接口方法实现。但是,使用简单的包装器就可以轻松实现相同的行为:

public class MyImplementation implements MyInterface {
    public MyImplementation(String name) {
    }
    @Override
    public MyInterface getInstance() { // static is not allowed here
        return getInstanceImpl();
    }
    public static getInstanceImpl() {
        return new MyImplementation(name)
    }
}

Java编译器可以代表您做同样的事情,但是看到静态方法实现实例方法既不寻常又令人困惑,因此我的猜测是Java设计人员决定不提供这种“魔力”。

2020-11-01