자바 8 의 새로운 기능 중 하나: 기본 인터페이스 방법
3857 단어 자바
기본 인터페이스 방법 을 도입 한 배경
자바 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()
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.