2017-08-09 4 views
3

私はこのようなコードがあるとしましょう:インターフェイスを実装するクラスでインターフェイスメソッドを静的にすることができないのはなぜですか?

public interface JustAnInterface { 
    void doSomething(); 
} 

public class JustAnInterfaceImplementation implements JustAnInterface { 

    @Override 
    public static void doSomething() { 

    } 
} 

はなぜstatic doSomething()方法は「メソッドはスーパークラスからメソッドをオーバーライドしません」というエラーを示していますか?

+7

インターフェイスで定義されたメソッドは静的ではないためです。あなたの質問は基本的に円形です。 – EJP

+1

一般的に、静的メソッドはオーバーライドする意味がありません。それらは、それらが定義されているクラスに属し、そのクラスにのみ属し、階層の一部を構成しません。 – Michael

+1

メソッドのシグネチャはインターフェイスとは異なります。 –

答えて

5

@Overrideとというスタティックが単に一緒に行こうとしないため、言うこともできます。

注意ポリモーフィズムは、非静的メソッドに対してのみ機能します。 スタティックは、あなたのメソッドが含まれているクラスに「接続」されていることを意味します。

つまり、staticメソッド呼び出しのすべてをコンパイル時に知っています。しかし、をオーバーライドしたメソッドを実行時に実行するかどうかを判断するプロセスは実行時に発生します。これらの2つの概念は、Javaでは一緒には動作しません。

1

すべて何GhostCatの言うことは正しいですが、@Override注釈は、コンパイル・エラーの直接の原因ではありません。

このメソッドを削除しても、このメソッドはコンパイル時に無効です。

オーバーライド/インプリメンテーションはインスタンスメソッドに対してのみ有効なので、派生クラスにstatic修飾子を追加することでメソッドをオーバーライドまたは実装することはできません。注釈なし
試してみてください。

public class JustAnInterfaceImplementation implements JustAnInterface { 

    public static void doSomething() { 

    } 
} 

あなたはより具体的なコンパイルエラーを持っていることになるよりも持つ1 @Override

上書きしたり、スーパータイプからメソッドを実装していない方法

オーバーライドメソッドは、静的および非静的メソッドはなく、単にためstaticの、異なるシグネチャを有する

1

静的です。

非スタティックメソッドは、秘密の余分なパラメータをとります。値はthisです。あなたのpythonに精通している場合

、明示的にこれを見ることができます:ここで

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

は、selfパラメータは通常のパラメータです:あなたは自分でメソッドを呼び出すと、このパラメータを渡すことができます。

Javaでは、それは同じです。 doSomethingメソッドを呼び出すと、1つのパラメータが暗黙的に渡され、その値はthisになります。

ただし、静的メソッドはゼロのパラメータをとります。したがって、実際にはオーバーライドに相当するものではないため、メソッドを正しくオーバーライドしているわけではありません。

JVMは、パラメータを破棄する必要があると判断する必要があります。言語はこれを可能にするために書かれていたかもしれませんが、デザイナーはそれを禁止するという簡単な方法を取っていました(とにかくそれを使用する理由はないからです)。

関連する問題