2017-11-26 4 views
0

私はOCAのために勉強しています。私は頭の中で遭遇するすべての質問に対して答えを見つけようとします。抽象クラスはインタフェースのメソッドを隠すか、またはオーバーライドしますか?

これはコードです:私はクラスFooで上書きする必要はありません。このような状況で

interface InterfaceA { 
public default Number method(){ 
    return 5; 
} 

} 

abstract class AbstractB { 
    public Long method() { 
     return 3L; 
    } 
} 

public class Foo extends AbstractB implements InterfaceA { 
    public static void main(String[] args) { 
     System.out.println(new Foo().method()); 
    } 
} 
    } 

。 私はクラスFooで明示的にオーバーライドする必要がある同じメソッドで2つのインターフェイスを実装する場合は知っています。上記の例では、結果はAbstractB(3)です。私の質問:インターフェイスからメソッドを暗黙的にオーバーライドまたは隠す抽象クラスですか? からではなく、Fooの結果がAbstractBの結果を出力する理由は何ですか?この特定の場合printlnプリント3への呼び出しで

答えて

1

抽象クラスは、インターフェイスからメソッドを実装します。オーバーライドする基本メソッドがないため、これはオーバーライドとしてカウントされません。言い換えれば、あなたは、基本クラスmethod()の呼び出しがコンパイルされないでしょう。この

abstract class AbstractB { 
    public Long method() { 
     return super.method(); // <<==== Does not compile! 
    } 
} 

を行うことをしようとした場合。

非表示にすることができるのはstaticのメソッドしかないため、非表示にすることもできません。

なぜクラスFooがインターフェイスからではなく、その親クラスから結果を取得するのですか?

インターフェイスにはデフォルトの実装が用意されています。つまり、継承の行に何も用意されていない場合に得られるものです。この場合、抽象基本クラスは実装を提供するので、インタフェースからのデフォルト実装よりも「勝利」します。

+0

オーバーライドまたは隠蔽されていない理由は分かりますが、Fooクラスがインターフェイスからではなく親クラスから結果を取得するのはなぜですか? – apotalion

+0

@apotalion編集をご覧ください。 – dasblinkenlight

0

AbstractBクラスFooこのbevahiorを継承する場合には界面InterfaceA方法methodを実現するためです。しかし、は、println呼び出しがデフォルトメソッドInterfaceAに委譲するインターフェイスメソッドを実装していませんでした。最後に、あなたの質問に答えるためにAbstractBではなくInterfaceAのメソッドと同じ署名を持っているので、を実装しています。

関連する問題