자바 8 의 새로운 기능 중 하나: 기본 인터페이스 방법

3857 단어 자바
자바 8 부터 인 터 페 이 스 는 방법 만 설명 할 수 있 는 곳 이 아니 라 방법 을 설명 할 때 기본 적 인 실현 을 줄 수 있 습 니 다. 우 리 는 기본 인터페이스 방법 이 라 고 부 릅 니 다. 이 인 터 페 이 스 를 실현 하 는 모든 하위 클래스 는 이 방법의 기본 적 인 실현 을 가 질 수 있 습 니 다.
기본 인터페이스 방법 을 도입 한 배경
자바 8 은 자바 버 전 업데이트 교체 과정 에서 가장 큰 변화 가 있 는 버 전 으로 볼 수 있 습 니 다.그래서 자바 8 의 기본 인터페이스 방법 을 처음 봤 을 때, 나 는 이것 이 자바 의 설계 자가 자신 을 메 우기 전에 파 낸 구덩이 라 는 것 을 처음 느 꼈 다.
이전 몇 편의 설명 에서 우 리 는 자바 8 이 기 존의 인터페이스 에 많은 방법 을 추가 했다 는 것 을 알 고 있다. 예 를 들 어 List 의 sort(Comparator super E> c) 방법 이다.자바 8 이전 인터페이스의 디자인 방향 에 따라 인터페이스 에 방법 설명 을 추가 할 때 이 인 터 페 이 스 를 실현 하 는 클래스 는 모두 이 새로운 추가 방법 에 해당 하 는 실현 을 추가 해 야 합 니 다.호환성 을 고려 하면 바람 직 하지 않다. 그래서 이것 은 구덩이 이 고 새로운 특성 은 인터페이스 에 새로운 방법 을 추가 해 야 한다. 물고기 와 곰 발바닥 을 동시에 얻 기 위해 자바 8 의 설계 자 는 기본 인터페이스 방법의 개념 을 제시 했다.
이렇게 말 하면 기본 인터페이스 방법 은 api 의 설계 자 를 위해 개 발 된 것 같 습 니 다. 일반 개발 자 와 거리 가 있 습 니 다. 이렇게 생각 하 는 것 은 약간 툴 슨 이 깨 졌 습 니 다. 비록 우 리 는 jdk 를 디자인 할 필요 가 없 지만 우 리 는 일상적인 개발 과정 에서 api 를 다른 업무 자 에 게 호출 하 는 수 요 를 제공 할 것 입 니 다. 우리 가 api 를 업데이트 할 때기본 적 인 방법 으로 더욱 고 급 스 러 운 기능 을 제공 하고 호환성 을 유지 할 수 있다.
2. 기본 인터페이스 방법의 정의
기본 인터페이스 방법의 정 의 는 매우 간단 합 니 다. 인터페이스 방법 정의 전에 default 키 워드 를 추가 하면 다음 과 같 습 니 다.
public interface A {

    /**
     *       
     */
    default void method() {
        System.out.println("This is a default method!");
    }

}

우리 가 이렇게 기본 적 인 방법 을 정의 한 후에 이 인 터 페 이 스 를 실현 하 는 모든 하위 클래스 는 간접 적 으로 이 방법 을 가지 고 있다.또는 너 는 나 처럼 인터페이스 와 추상 류 가 점점 닮 아 간다 고 느 낄 것 이다. 확실 하지만 그들 사이 에는 다음 과 같은 차이 가 있다.
1.           ,          

2.          ,      

추상 은 우리 가 위 에서 언급 한 문 제 를 해결 하 는 동시에 다음 과 같은 장점 도 가진다.
1.                 ,          ,                  (      throw new UnsupportedException())

2.      java            (           ,             ,              )

3. 충돌 과 그 해결 방법
하나의 클래스 가 여러 개의 인 터 페 이 스 를 실현 할 수 있 기 때문에 하나의 클래스 가 여러 개의 인 터 페 이 스 를 실현 할 때 이 인터페이스 에 두 개 이상 의 방법 으로 같은 기본 방법 에 서명 할 때 충돌 이 발생 합 니 다. 자바 8 은 다음 과 같은 세 가지 원칙 으로 충돌 을 해결 합 니 다.
1.             ,             

2.   1    ,                       

3.   2     ,         

다음은 몇 가지 예 를 통 해 설명 한다.
예 1
public interface A {

    /**
     *       
     */
    default void method() {
        System.out.println("A's default method!");
    }

}

public interface B extends A {

    /**
     *       
     */
    default void method() {
        System.out.println("B's default method!");
    }

}

public class C implements A, B {

    public static void main(String[] args) {
        new C().method();
    }

}

//   :B's default method!

이 곳 은 인터페이스 B 가 A 거리 C 보다 가 깝 고 B 의 method 는 구체 적 인 기본 구현 이기 때문에 규칙 2 에 따라 실제 적 으로 인터페이스 B 의 기본 방법 을 호출 합 니 다.
예 2
public class D implements A {
}

public class C extends D implements A, B {

    public static void main(String[] args) {
        new C().method();
    }

}

//   :B's default method!

예 2 는 기 존의 인터페이스 A, B 를 바탕 으로 인터페이스 A 를 실현 하 는 클래스 D 를 추가 한 다음 에 클래스 C 를 D 에 계승 하고 A 와 B 를 실현 한다. 이곳 은 C 가 D 와 더 가 깝 지만 D 의 구체 적 인 실현 이 A 에 있 기 때문에 B 중의 기본 방법 은 가장 가 까 운 기본 적 인 실현 이다. 규칙 2 에 따라 이곳 은 실제 적 으로 B 의 기본 적 인 방법 을 호출 한다.
예 3
// A    

public interface B {

    /**
     *       
     */
    default void method() {
        System.out.println("B's default method!");
    }

}

public class C implements A, B {

    @Override
    public void method() {
        //       
        B.super.method();
    }

    public static void main(String[] args) {
        new C().method();
    }

}

예 3 에서 인터페이스 B 는 더 이상 인터페이스 A 를 계승 하지 않 기 때문에 이때 C 에서 기본 방법 method() 을 호출 하여 인터페이스 A 와 B 의 구체 적 인 실현 거리 가 같 고 컴 파일 러 가 확실 하지 않 기 때문에 오 류 를 보고 할 때 명시 적 으로 지정 해 야 한다. B.super.method()

좋은 웹페이지 즐겨찾기