代码之家  ›  专栏  ›  技术社区  ›  Dmitry Smolyaninov

为什么接口方法在实现接口的类中不能是静态的?

  •  3
  • Dmitry Smolyaninov  · 技术社区  · 7 年前

    假设我有这样的代码:

    public interface JustAnInterface {
        void doSomething();
    }
    
    public class JustAnInterfaceImplementation implements JustAnInterface {
    
        @Override
        public static void doSomething() {
    
        }
    }
    

    static doSomething() "?

    3 回复  |  直到 6 年前
        1
  •  7
  •   GhostCat    7 年前

    有人可能会说:因为@覆盖和 只是不要一起去。

    请记住:多态性只适用于非静态方法。

    换句话说:你知道关于 静止的 要调用的方法发生在运行时。这两个概念在Java中并不同时存在。

        2
  •  2
  •   davidxxx    7 年前

    GhostCat所说的一切都是正确的,但 @Override 注释不是编译错误的直接原因。

    即使删除它,该方法在编译时也是无效的。

    static 派生类中作为重写/实现的修饰符仅对实例方法有效。
    尝试不使用注释:

    public class JustAnInterfaceImplementation implements JustAnInterface {
    
        public static void doSomething() {
    
        }
    }
    

    @覆盖

    方法不会重写或实现超类型中的方法

    你应该得到如下信息:

    重写方法是静态的

        3
  •  1
  •   Andy Turner    7 年前

    静态和非静态方法具有不同的特征,这不仅仅是因为 static .

    this

    如果您熟悉python,您可以清楚地看到这一点:

    class SomeClass(object):
      def doSomething(self):
        pass // whatever method body
    

    在这里 self

    在Java中,情况大致相同。当您调用 doSomething 方法,则隐式地向其传递一个参数,这将成为

    然而,静态方法需要 参数。所以实际上,它们不是等价的重写,因此您没有正确地重写该方法。