2017-07-29 11 views
0
interface TestInterface 
{ 
    public static void square(int a) 
    { 
     System.out.println("Square is "+a*a); 
    } 

    public static void show() 
    { 
     System.out.println("Default Method Executed"); 
    } 

} 
class TestClass implements TestInterface 
{ 
    public void square(int a) 
    { 
     System.out.println(a*a); 
    } 

    public void show() 
    { 
     System.out.println("Overridden Method"); 
    } 
    public static void main(String args[]) 
    { 
     TestClass d=new TestClass(); 
     d.square(4); 
     TestInterface.square(4); 
     TestInterface.show(); 
     d.show(); 
    } 
} 

私のコードには疑問があります。私は静的メソッドをJAVAでオーバーライドすることはできないことを知ったが、ここでうまくいっているようだ。修飾子の 不正な組み合わせ::静的およびデフォルトJavaのインターフェースの静的メソッド

をJAVA理由は、この治療は何次のようにこの

interface TestInterface 
    { 
     default static void square(int a) 
     { 
      System.out.println("Square is "+a*a); 
     } 

     public static void show() 
     { 
      System.out.println("Default Method Executed"); 
     } 

    } 

のようなエラーがアップ作物 私は一緒にデフォルトと静的キーワードの両方を与え、エラーとして?

+3

静的メソッドは** shadowed **でオーバーライドされません。 –

+0

ありがとうございます。 @ Code-Apprentice、「影にされ、上書きされない」という言葉はどういう意味ですか?コンパイラは静的メソッドと非静的メソッドを2つの全く異なるエンティティとして扱いますか?彼らは同じ署名を持っていても? –

+0

次回は先行研究を試してみてください。 – GhostCat

答えて

2

staticメソッドは、関連するクラス/インタフェースのインスタンスなしで呼び出されることを意味します。通常、それらはユーティリティメソッドであることを意図しています。

defaultメソッドは、関係するインタフェースのインスタンスで呼び出されることを意味します。オーバーライドされない限り、このインタフェースのすべての実装はこのメソッド定義を持ちます。

これらの2つの用語が一緒に使用できない理由は、互いに矛盾するからです。defaultはオブジェクトが必要です。staticにはオブジェクトが必要ありません。

+0

ご協力ありがとうございます。私の疑問を明確にしました:) –

0

TestClass.show()およびTestClass.square()staticではないため、インターフェイスのstaticメソッドをオーバーライドしません。それらはメンバーメソッドであり、オブジェクトを呼び出す必要があります。一方、インターフェイス内で同じ名前のメソッドはstaticであるため、オブジェクトなしでインターフェイス名またはクラス名で呼び出すことができます。

+0

ありがとうございました。それは私の疑問を解決した:) –

関連する問題