Java 8には、インターフェイスの実装クラスに影響を与えることなく、インターフェイスに新しい機能機能を追加できるデフォルトメソッドが追加されました。以下の例でこれを説明しましょう。
コードコピーは次のとおりです。
パブリッククラスMyClassはインターフェイスを実装しています{
public static void main(string [] args){
}
@オーバーライド
public void sayssomething(){
// TODO自動生成方法スタブ
}
}
インターフェイスインターフェイスInterfacea {
public void sayssomething();
}
上記のコードは、MyClassクラスがInterfacesaインターフェイスのSayOmhines()メソッドを実装していることを示しています。次に、Interfacesaインターフェイスに新しいSayhi()メソッドを追加します。これが行われた場合、Sayhi()の実装方法を提供しない限り、MyClassクラスをコンパイルすることはできません。
デフォルトのメソッドは、インターフェイスによって定義されたメソッドのアクセス修飾子にキーワードを追加することにより、実装クラスはメソッドの実装を提供する必要はありません。例えば:
コードコピーは次のとおりです。
パブリッククラスMyClassはインターフェイスを実装しています{
public static void main(string [] args){
}
@オーバーライド
public void sayssomething(){
// TODO自動生成方法スタブ
}
}
インターフェイスインターフェイスInterfacea {
public void sayssomething();
デフォルトのpublic void sayshi(){
system.out.println( "hi");
}
}
すべてのデフォルトメソッドの実装を提供する必要があることに注意してください。したがって、デフォルトの方法により、コードがより柔軟になり、インターフェイスにそれらを実装する方法を記述することもできます。実装されたメソッドは、デフォルトメソッドとして実装されます。
では、複数のインターフェイスに競合がある場合はどうすればよいですか?
Javaクラスは複数のインターフェイスを実装できるため、2つ以上のインターフェイスに同じ名前のデフォルトインターフェイスメソッドがあり、競合を引き起こす状況がある可能性があります。プログラムが実行されているときにJava仮想マシンが実行されているため、どのデフォルトの方法を使用するかは明確ではありません。これにより、コンパイルエラーが発生します。
次の例を見てみましょう。
コードコピーは次のとおりです。
パブリッククラスMyClassはInterfacea、interfacebを実装します{
public static void main(string [] args){
myclass mc = new MyClass();
Mc.Sayhi();
}
@オーバーライド
public void sayssomething(){
// TODO自動生成方法スタブ
}
}
インターフェイスインターフェイスInterfacea {
public void sayssomething();
デフォルトのpublic void sayshi(){
System.out.println( "Hi Interfacea");
}
}
インターフェイスインターフェイスinterfaceb {
デフォルトのpublic void sayshi(){
system.out.println( "interfaceb" hi ");
}
}
コンパイルに合格することはできず、次のエラーを報告します。
「パラメーター()と()を使用してSayhiという名前のデフォルトのメソッドを重複させます。And()は、型インターフェイスとインターフェイスから継承されます。」
myclassクラスでsayhi()メソッドがオーバーライドされていない限り:
コードコピーは次のとおりです。
パブリッククラスMyClassはInterfacea、interfacebを実装します{
public static void main(string [] args){
myclass mc = new MyClass();
Mc.Sayhi();
}
@オーバーライド
public void sayssomething(){
// TODO自動生成方法スタブ
}
@オーバーライド
public void sayshi(){
system.out.println( "myclassのsayhi()の実装");
}
}
インターフェイスインターフェイスInterfacea {
public void sayssomething();
デフォルトのpublic void sayshi(){
System.out.println( "Hi Interfacea");
}
}
インターフェイスインターフェイスinterfaceb {
デフォルトのpublic void sayshi(){
system.out.println( "interfaceb" hi ");
}
}
どのインターフェースのSayhi()メソッドを呼び出すかを指定したい場合は、これを行うことができます。
コードコピーは次のとおりです。
パブリッククラスMyClassはInterfacea、interfacebを実装します{
public static void main(string [] args){
myclass mc = new MyClass();
Mc.Sayhi();
}
@オーバーライド
public void sayssomething(){
// TODO自動生成方法スタブ
}
@オーバーライド
public void sayshi(){
interfacea.super.sayhi();
}
}
インターフェイスインターフェイスInterfacea {
public void sayssomething();
デフォルトのpublic void sayshi(){
System.out.println( "Hi Interfacea");
}
}
インターフェイスインターフェイスinterfaceb {
デフォルトのpublic void sayshi(){
system.out.println( "interfaceb" hi ");
}
}
答えはとても簡単ですか?