Interface in Java 8(Default/Static methods)
5422 단어 Java
1.7 에서 우 리 는 이렇게 interface 를 정의 하고 declare method 를 정의 합 니 다.
public interface Play{
void show();
}
show () 방법 은 기본적으로 Public abstract 입 니 다.만약 우리 가 abstract class 를 정의 하려 면, 이렇게:
public abstract class AbstractPlay {
public abstract void show();
public boolean isTrue(){
return true;
}
}
abstract method 를 설명 할 수도 있 고 하나의 method 를 정의 할 수도 있 습 니 다. 모두 OK 이지 만 인터페이스 에 서 는 abstract method 만 선언 할 수 있 습 니 다. 이것 이 바로 interface 와 abstract class 의 주요 차이 입 니 다.
그러나 Jdk 1.8 까지 Stream API 가 생 겼 습 니 다. 이것 은 어떤 귀신 입 니까? 만약 에 이런 상황 이 있다 면 interface (이 interface 는 이미 여러 곳 에서 사용 되 었 습 니 다) 의 특성 을 확장 하고 싶 습 니 다. 이 원시 적 인 interface 에 방법 을 추가 하여 더욱 강해 지게 하려 면 어떻게 하 시 겠 습 니까?직접 추가?만약 그렇다면, 이전에 이 인 터 페 이 스 를 실현 한 클 라 스 가 이 인 터 페 이 스 를 모두 다시 실현 해 야 한 다 는 것 을 의미 합 니 다. 정말 좋 습 니까?이러 면 안 돼.
그래서 jdk 1.8 에 default key word 가 있어 서 이 문 제 를 우호 적 으로 해결 할 수 있 습 니 다.
public interface TestDefaultMethod {
void add();
default void show(){
}
}
이렇게 인터페이스 에서 하나의 method 를 정의 할 수 있 습 니 다. amazing 그 렇 죠?ok, 사실 여기 서 보충 해 야 할 문제 가 있 습 니 다. 자바 에 서 는 다 중 inheritance 를 허용 하지 않 는 다 는 것 을 알 고 있 습 니 다. 다 중 inheritance 는 diamond problem 이 라 고 부 릅 니 다. 즉, class C inherit class A 와 class B 가 있 으 면 A 와 B 중 에 똑 같은 방법 이 있 습 니 다 show ().이때 class C 의 인 스 턴 스 는 obj 라 고 합 니 다. obj. show () 일 때 invoke 에 가 는 어떤 show () 를 모 릅 니 다. 맞 습 니까?
두 개의 인터페이스 A 와 인터페이스 B 일 때 는 A 와 B 에서 default 키 워드 를 사용 하지 않 고 똑 같은 두 개의 show () 를 define 했다.class C implements 라 는 두 인터페이스, 그러면 C 에 서 는 rewrite show () 를 가 야 합 니 다.A 와 B 중 에는 show () 만 선언 했 을 뿐 define show () 는 없 기 때문에 이 럴 때 충돌 하지 않 는 다.그리고 C 의 intance obj 는 obj. show () 로 갈 수 있 습 니 다. 이것 은 매우 정상 적 인 상황 입 니 다. 1.7 전에 모두 이렇게 했 습 니 다.그렇다면 현재 default 키워드 define 을 사용 하여 똑 같은 show () 두 개 를 사용 했다 면, 이때 의 상황 은 앞의 diamond problem 과 비슷 해 졌 고, 이때 도 error 가 있 을 수 있 기 때문에 이 문 제 는 Jdk 1.8 에 도 존재 한다. 이 문 제 를 해결 하 는 방법 은 C 에서 rewrite show () 방법 이 었 으 면 좋 겠 다.따라서 하나의 Implements 하나의 interface (이 interface 에서 default define 하나의 show () 를 사용한다 면, 이때 obj. show () 를 직접 호출 할 수 있 습 니 다. C 에서 rewrite 하지 않 아 도 됩 니 다. implements 두 개의 Interface 를 사용 하고, 두 인터페이스 에 default define 을 사용 하 는 두 개의 같은 show () 방법 이 포함 되 어 있 습 니 다.이 럴 때 는 C 에서 다시 rewrite show () 를 해 야 합 니 다.
일 을 좀 더 복잡 하 게 해라.
public interface I {
default void show(){
System.out.println("A");
}
}
public class C {
public void show(){
System.out.println("C");
}
}
public class A extends C implements I{
}
class A 의 instance obj, obj. show () 는 어떤 상황 일 까요?정 답 은 출력 C 입 니 다. class 가 interface 보다 더 많은 power 를 가지 고 있 기 때문에 이 럴 때 class C 의 show () 는 interface I 의 show () 를 숨 깁 니 다.
또 하나의 작은 문제 가 있 습 니 다. 인터페이스 에서 default define 을 사용 하면 Object 에 존재 하 는 방법 을 사용 할 수 있 습 니까?
public interface I {
default boolean equals (Object o){
return true;
}
}
기억 해라, 이렇게 하면 안 된다.
jdk 1.7 이전 에는 interface 에서 static method 를 사용 할 수 없습니다.하지만 jdk 1.8 이면 됩 니 다. 아래 처럼:
public interface StaticKeyWordTest {
static void sayHi(){
System.out.println("Hi static !");
}
static void main(String... args){
StaticKeyWordTest.sayHi();
}
}
여기까지 만 얘 기 하 자.
더 많은 것 은 여 기 를 참고 할 수 있 습 니 다.https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.