2017-02-12 16 views
6

インタフェースと抽象クラスの違いについては問いません。親クラスとインプリメンテーションインタフェースに同じ名前の静的メソッドと非静的メソッド

個別に成功していますか?

interface Inter { 
    public void fun(); 
} 

abstract class Am { 
    public static void fun() { 
     System.out.println("Abc"); 
    } 
} 

public class Ov extends Am implements Inter { 
    public static void main(String[] args) { 
     Am.fun(); 
    } 
} 

なぜ競合が発生していますか?

+3

質問は何ですか? – shmosel

答えて

7

staticおよび非staticのメソッドは同じclassに同じ名前を持つことはできません。これは、参照を使用してstaticメソッドと非staticメソッドの両方にアクセスできるため、コンパイラはstaticメソッドまたはstaticメソッドを呼び出すかどうかを判断することができないためです。

は、例えば、以下のコードを検討:

Ov ov = new Ov(); 
ov.fun(); //compiler doesn't know whether to call the static or the non static fun method. 

ジャワstatic方法は、参照を使用して呼び出すことを可能にすることができる理由は、開発者がシームレス非static方法static方法を変更することができるようにすることです。

2

構文を賢明に修正するために、コードを記述する必要があります。また、私たちのコードがコンパイラにあいまいさを与えないことを理解することも同様に重要です。そのようなあいまいさがある場合、言語設計者はそのようなコードをコンパイルすることを許さないよう注意しています。

クラスはスーパークラスからの動作を継承します。静的メソッドは、単にクラス名を使用してインスタンスからアクセスすることもできます。同じ名前と署名を持つメソッドがあるとします(staticキーワードを除く)、インスタンス上でメソッドを呼び出すと、コンパイラはトスを実行します。プログラマーが何をするつもりなのか、どのように決定するのですか?したがって、言語設計者は、このケースでコンパイルエラーが発生することにしました。

として

http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html#jls-8.4.8.2

クラスCが宣言または静的メソッドmを継承する場合当たり、その後Mがmの署名はサブシグニチャである任意のメソッドm」を非表示にすると言われていますさもなければ、Cのコードにアクセス可能な、Cのスーパークラスおよびスーパーインタフェース内の、m 'のシグネチャの名前(§8.4.2)。 静的メソッドがインスタンスメソッドを隠す場合、コンパイル時エラーです。

public class Ov extends Am implements Inter { 
    public static void main(String[] args) { 
     Ov.fun(); //static method is intended to call, fun is allowed to be invoked from sub class. 
     Ov obj = new Ov(); 

     obj.fun(); //** now this is ambiguity, static method can 
        //be invoked using an instance, but as there is 
       //an instance method also hence this line is ambiguous and hence this scenario results in compile time error.** 
    } 
} 
+0

静的メソッドは、インスタンス*を使用して呼び出すことができます。いいえ。インスタンスを使用して* Java *を呼び出すことはできません。 (少なくともプログラマーではない) – CKing

関連する問題