JAva 8:インタフェースの新しい特性(定数と抽象メソッドを除く)、デフォルトメソッドと静的メソッド

4963 ワード


一、原則
二、解読規則の細分化
三、例
四、インタフェースインターフェース
一、原則
複数のデフォルトメソッドの場合Java 8を使用してアプリケーションを開発するには、サブクラスが複数のインタフェースを実装する場合、インタフェースのデフォルトメソッド定義に複数のデフォルトメソッドが表示され、インタフェースのデフォルトメソッドに同名の場合があります.この場合、サブクラスは実装または呼び出し時に通常3つの原則に従います.
  • 1、クラス内のメソッド優先度最高
  • 2、第1条が判断できない場合、サブインタフェースの優先度はより高い:関数署名とともに、最も具体的な実装のデフォルトメソッドを持つインタフェースを優先的に選択する.すなわち、BがAを継承している場合、BはAよりも具体的な
  • である.
  • 3、まだ判断できない場合、複数のインタフェースを継承するクラスは、所望のメソッドを表示および呼び出すことによって、どのデフォルトメソッドを使用するインプリメンテーション
  • を表示的に選択しなければならない.
     
    二、解読規則の細分化
  • インタフェースで定義された静的メソッドは、インタフェースを介してのみ
  • を呼び出すことができる.
  • クラスのオブジェクトを実装ことにより、インタフェース内のデフォルトメソッドを呼び出すことができ、実装クラスがインタフェース内のデフォルトメソッドを書き換えた場合、呼び出されたときも書き換え後のメソッド
  • を呼び出すことができる.
  • 子クラス(または実装クラス)が継承する親クラスと実装インタフェースが同名同パラメータのメソッドを宣言した場合、子クラスはこのメソッドを書き換えていない場合、デフォルトで呼び出されるのは親クラスの同名同パラメータのメソッドであるクラス優先原則(メソッドのみであり、プロパティがどの属性であるかを明確に示す必要がある場合)
  • 実装クラスが複数のインタフェースを実装し、複数のインタフェースに同名の同じパラメータのデフォルトメソッドが定義されている場合、実装クラスがこのメソッドを書き換えていない場合、エラー---インタフェース競合、、、これは実装クラスでこのメソッド
  • を書き換える必要がある.
  • 実装クラスでインタフェースで書き換えられたメソッドを呼び出す方法CompareA.super.method2();
  •                  ,              CompareA CompaareB         

  • 三、例
    例1:
    
    public interface CompareA {
    
    
        static void method1() {
            System.out.println("CompareA      ");
        }
    
        default void method2() {
            System.out.println("CompareA     method2");
        }
    
        default void method3() {
            System.out.println("CompareA     method3");
        }
    
        void walk();
    
    }
    
    
    interface CompareB {
    
    
        static void method1() {
            System.out.println("CompareB      ");
        }
    
        default void method2() {
            System.out.println("CompareB     method2");
        }
    
        default void method3() {
            System.out.println("CompareB     method3");
        }
    
        void walk();
    }
    
    class SubCompareA extends SuperCompare implements CompareA {
    
        //         CompareA CompaareB         
        @Override
        public void walk() {
    
        }
    
        public void show() {
            CompareA.super.method2();
            CompareA.super.method3();
    
        }
    
        @Override
        public void method2() {
            System.out.println("SubCompareA method2");
        }
    }
    
    class SuperCompare {
        public void method3() {
            System.out.println("SuperCompare   method3");
        }
    }
    
    class CompareATest {
        public static void main(String[] args) {
            //            ,       
            CompareA.method1();
            CompareB.method1();
    
            System.out.println();
            SubCompareA subCompareA = new SubCompareA();
            subCompareA.method2();
            subCompareA.method3();
    
            subCompareA.show();
    
    
    
        }
    }
    
        :
    
    CompareA      
    CompareB      
    
    SubCompareA method2
    SuperCompare   method3
    CompareA     method2
    CompareA     method3

     
    例2:第1の判断ができない場合、サブインタフェースの優先度が高くなる
    /**
    *            info  
    */
    public interface Phone {
       default void info(){
           System.out.println("      ");
      	}
    }
    
    
    /**
    *   MiPhone        Phone          info  
    */
    public interface MiPhone extends Phone{
       default void info(){
           System.out.println("        ");
      	}
    }
    
    
    /**
    *    Phone MiPhone   
    */
    public class M2sPhone implements Phone,MiPhone {
    
       public static void main(String[] args) {
           new M2sPhone().info();
      	}
    }
    
        : 
            
    

     
    例3:クラス優先原則(メソッドのみ、属性であればどの属性かを明確に示す必要がある)
    
    interface A { int x = 0}
    
    class B { int x = 1}
    
    class C extends B implement A {
    	public void px() {
    		System.out.println(x);//     
    		System.out.println(super.x);//   x
    		System.out.println(A.x); //   x
    		
    	}
    }
    

     
    例4:同じ名前の複数のインタフェースが抽象メソッドである場合、実装クラスでプレイメソッドを実装するのはPlayableとBounceableに相当する抽象メソッドが実装される
    
    interface Playable {
    	void play();
    }
    
    interface Bounceable {
    	void play();
    }
    
    interface Rollable extends Playable,Bounceable {
    	Ball ball = new Ball("PingPang");
    }
    
    class Ball implement Rollable {
    	private String name;
    	
    	public String getName() {
    		return name;
    	}
    	public Ball(String name) {
    		this.name = name;
    	}
    	public void play() {
    		System.out.println(ball.getName());
    	}
    }

    四、インタフェースインターフェース
    JAvaではクラス単一継承が行われ、インタフェースは多重継承インタフェースでコンストラクタを定義できません.インタフェースをインスタンス化できません
    実装クラスがインタフェース内のすべてのメソッドを上書きすると、実装クラスはインスタンス化できます.実装クラスがインタフェース内の抽象メソッドを上書きしていない場合、実装クラスは抽象クラスです.
    抽象クラスはインタフェースの抽象メソッドを実装しないか,実装部分を実装することができるが,抽象クラスを継承する一般クラスは抽象に残っている実装インタフェースのない抽象メソッドを実装する必要がある.
    C+Bの合計の書き換え方法は、=Aのすべての方法でなければなりません.
    C,Bに拡張の方法があれば>Aのすべての方法である.
    
    
    interface Flyable {
        void run();
    
        void fly();
    }
    
    abstract class Bus implements Flyable {
    
    }
    
    abstract class Bus1 extends Bus {
    
        @Override
        public void run() {
    
        }
    }
    
    class Bus2 extends Bus1 {
        @Override
        public void fly() {
    
        }
    }
    
    
    class Car implements Flyable {
    
    
        @Override
        public void run() {
    
        }
    
        @Override
        public void fly() {
    
        }
    }